定义R函数时,有时会想不到它依赖于封闭环境中的对象。像这样:
a <- 1
fn <- function(x) x + a
如果这是无意发生的话,可能会导致难以调试的问题。
是否有一种简单的方法来测试fn
是否使用封闭环境中的对象?
类似的东西:
test(fn=fn, args=list(x=1))
## --> uses 'a' from enclosing environment
答案 0 :(得分:3)
一种可能性是使用findGlobals
软件包中的codetools
函数,该函数旨在:
查找闭包使用的全局函数和变量
这在您的示例中有效:
#install.packages('codetools')
codetools::findGlobals(fn)
[1] "+" "a"
如果我们在函数中定义a
,它将消失:
fn <- function(x) {
a = 1
x + a
}
codetools::findGlobals(fn)
[1] "{" "+" "="
但是我没有在更复杂的功能中使用过它,所以我不能说使用更复杂的功能将有多精确。该文档带有以下警告:
结果是一个近似值。 R语义仅允许识别可能是局部变量的变量(以及假定不使用assign和rm的事件)。