我经常编写需要查看环境中其他对象的函数。例如:
> 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的修改不会导致意外的副作用。