我试图通过将所有必要的依赖项(函数和数据)加载到新环境中并评估该环境中的表达式,以沙盒方式运行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

09-20 13:10