我试图通过将所有必要的依赖项(函数和数据)加载到新环境中并评估该环境中的表达式,以沙盒方式运行R代码块。但是,我在环境中调用其他函数的函数遇到麻烦。这是一个简单的例子:
jobenv <- new.env(parent=globalenv())
assign("f1", function(x) x*2, envir=jobenv)
assign("f2", function(y) f1(y) + 1, envir=jobenv)
expr <- quote(f2(3))
在
eval
上使用expr
失败,因为f2
找不到f1
> eval(expr, envir=jobenv)
Error in f2(3) : could not find function "f1"
而明确附加环境是可行的
> attach(jobenv)
> eval(expr)
[1] 7
我可能缺少明显的东西,但找不到有效的
eval
调用的任何排列。有没有办法在不附加环境的情况下获得相同的效果? 最佳答案
有很多方法可以做到这一点,但我有点喜欢这种方法:
jobenv <- new.env(parent=globalenv())
local({
f1 <- function(x) x*2
f2 <- function(y) f1(y) + 1
}, envir=jobenv)
## Check that it works
ls(jobenv)
# [1] "f1" "f2"
local(f2(3), envir=jobenv)
# [1] 7
eval(quote(f2(3)), envir=jobenv)
# [1] 7