在定义R函数时,我有时会忽略它依赖于封闭环境中的对象。类似于:
a <- 1
fn <- function(x) x + a如果无意中发生这种情况,可能会导致难以调试的问题。
有没有一种简单的方法来测试fn是否使用封闭环境中的对象?
类似于:
test(fn=fn, args=list(x=1))
## --> uses 'a' from enclosing environment发布于 2019-05-21 02:00:46
一种可能是使用codetools包中的findGlobals函数,该函数旨在:
查找闭包使用的全局函数和变量
这在您的示例中是有效的:
#install.packages('codetools')
codetools::findGlobals(fn)
[1] "+" "a"如果我们在函数中定义a,它就会消失:
fn <- function(x) {
a = 1
x + a
}
codetools::findGlobals(fn)
[1] "{" "+" "="但我没有在更复杂的函数中使用过它,所以我不能说在更复杂的函数中它会有多精确。这些文档附带以下警告:
结果是一个近似值。R语义只允许标识可能是局部的变量(以及假定不使用assign和rm的事件)。
https://stackoverflow.com/questions/56225221
复制相似问题