在不同的环境中调用 R 函数

5 parallel-processing environment eval r rlang

我觉得这样做应该相当简单,但我终生无法找到解决方案......我想在与它所在的环境不同的环境中评估 R 函数。

我想要什么:

# A simple function
f <- function() {
  x + 1
}

# Create an env and assign x <- 3
env <- new.env()
assign("x", 3, envir = env)

# Call f on env
call_on_env(f, env)
#> 4
Run Code Online (Sandbox Code Playgroud)

我最接近“ call_on_env()”的是:

# Quote call and evaluate
quo <- quote(f())
eval(quo, envir = env)
Run Code Online (Sandbox Code Playgroud)

不幸的是,上面的代码返回一个错误:Error in f() : object 'x' not found. 因此,然后...有没有办法让我评价f()env

编辑:我能发送f()env,然后调用它,但这种叶子f()永久存在。对于上下文[见下文],我想与一些预加载的包并行调用该函数。

上下文:我正在并行调用一个函数,parallel::clusterMap()并且我希望在我的全局环境中加载的包也加载到集群上。据我所知,parallel::clusterExport()只能导出一个变量列表,所以它对我不起作用......

Ric*_*ven 6

搬进fenv

environment(f) <- env
f()
# [1] 4
Run Code Online (Sandbox Code Playgroud)

注意:正如您在这里遇到的那样,跨不同环境评估对象是不可取的。最好将您计划相互交互的所有对象保留在同一环境中。

如果你不想改变 的环境f,你可以将以上所有内容放入一个新函数中。

fx <- function(f, env) {
    environment(f) <- env
    f()
}
fx(f, env)
# [1] 4
Run Code Online (Sandbox Code Playgroud)