我经常编写需要查看环境中其他对象的函数。例如:

> a <- 3
> b <- 3
> x <- 1:5
> fn1 <- function(x,a,b) a+b+x
> fn2 <- function(x) a+b+x
> fn1(x,a,b)
[1]  7  8  9 10 11
> fn2(x)
[1]  7  8  9 10 11

不出所料,这两个函数是相同的,因为fn2在执行时可以“看到” a和b。但是每当我开始利用此功能时,大约30分钟之内,我都会在没有任何必要变量(例如a或b)的情况下调用该函数。如果我不利用这一点,那么我会觉得我不必要地绕过对象。

明确说明功能要求更好吗?还是应该通过内联注释或该功能的其他文档来解决此问题?有没有更好的办法?

最佳答案

如果我知道我需要一个由某些值参数化并重复调用的函数,则可以通过使用闭包来避免使用全局变量:

make.fn2 <- function(a, b) {
    fn2 <- function(x) {
        return( x + a + b )
    }
    return( fn2 )
}

a <- 2; b <- 3
fn2.1 <- make.fn2(a, b)
fn2.1(3)    # 8
fn2.1(4)    # 9

a <- 4
fn2.2 <- make.fn2(a, b)
fn2.2(3)    # 10
fn2.1(3)    # 8

巧妙地避免了引用全局变量,而是将函数的包围环境用于a和b。调用fn2实例时,对全局变量a和b的修改不会导致意外的副作用。

08-19 22:53