在不同的环境中调用 R 函数
Calling an R function in a different environment
我觉得这样做应该相当简单,但我终其一生都找不到解决方案...我想在不同于它所在环境的环境中评估 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
我最接近“call_on_env()
”的是:
# Quote call and evaluate
quo <- quote(f())
eval(quo, envir = env)
不幸的是上面的代码 returns 出错了:Error in f() : object 'x' not found
。那么...有没有办法让我在env
上评估f()
?
编辑: 我可以将 f()
发送到 env
然后调用它,但这会使 f()
永久留在那里。对于上下文 [见下文],我想与一些预加载的包并行调用该函数。
上下文: 我正在与 parallel::clusterMap()
并行调用一个函数,我希望在我的全局环境中加载的包也能加载到集群。据我所知,parallel::clusterExport()
只能导出变量列表,所以它对我不起作用...
将f
移动到env
environment(f) <- env
f()
# [1] 4
注意:正如您在这里遇到的,跨不同环境评估对象是不可取的。最好将您计划相互交互的所有对象都放在同一环境中。
如果你不想改变f
的环境,你可以将以上所有内容放入一个新函数中。
fx <- function(f, env) {
environment(f) <- env
f()
}
fx(f, env)
# [1] 4
source()
函数可能有帮助:
source('scriptfilename.R')
如果文件位于另一个路径,则使用:
source('YOURPATH/scriptfilename.R')
当您 运行 source()
时,它会将所有功能拉入您当前的环境中。然后,您可以引用 R 脚本中包含的任何函数。
但是我不建议在您的 R 项目文件夹结构之外引用 functions/scripts,因为如果您与其他人共享您的 R 项目文件夹,链接将会中断。
我觉得这样做应该相当简单,但我终其一生都找不到解决方案...我想在不同于它所在环境的环境中评估 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
我最接近“call_on_env()
”的是:
# Quote call and evaluate
quo <- quote(f())
eval(quo, envir = env)
不幸的是上面的代码 returns 出错了:Error in f() : object 'x' not found
。那么...有没有办法让我在env
上评估f()
?
编辑: 我可以将 f()
发送到 env
然后调用它,但这会使 f()
永久留在那里。对于上下文 [见下文],我想与一些预加载的包并行调用该函数。
上下文: 我正在与 parallel::clusterMap()
并行调用一个函数,我希望在我的全局环境中加载的包也能加载到集群。据我所知,parallel::clusterExport()
只能导出变量列表,所以它对我不起作用...
将f
移动到env
environment(f) <- env
f()
# [1] 4
注意:正如您在这里遇到的,跨不同环境评估对象是不可取的。最好将您计划相互交互的所有对象都放在同一环境中。
如果你不想改变f
的环境,你可以将以上所有内容放入一个新函数中。
fx <- function(f, env) {
environment(f) <- env
f()
}
fx(f, env)
# [1] 4
source()
函数可能有帮助:
source('scriptfilename.R')
如果文件位于另一个路径,则使用:
source('YOURPATH/scriptfilename.R')
当您 运行 source()
时,它会将所有功能拉入您当前的环境中。然后,您可以引用 R 脚本中包含的任何函数。
但是我不建议在您的 R 项目文件夹结构之外引用 functions/scripts,因为如果您与其他人共享您的 R 项目文件夹,链接将会中断。