R:测试函数从封闭环境中获取哪些对象

时间:2019-05-20 16:55:11

标签: r function debugging testing environment

定义R函数时,有时会想不到它依赖于封闭环境中的对象。像这样:

a <- 1
fn <- function(x) x + a

如果这是无意发生的话,可能会导致难以调试的问题。

是否有一种简单的方法来测试fn是否使用封闭环境中的对象?

类似的东西:

test(fn=fn, args=list(x=1))
## --> uses 'a' from enclosing environment

1 个答案:

答案 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的事件)。