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

时间:2018-04-04 00:31:02

标签: r parallel-processing eval environment rlang

我觉得这样做应该相当简单,但我不能为我的生活找到解决方案......我想在不同于它的环境中评估R函数。< / p>

我想要的是什么:

# 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)

不幸的是,上面的代码会返回错误:Error in f() : object 'x' not found。那么......有没有办法让我评估f()上的env

修改:我可以将f()发送到env,然后再将其调用,但这会永久地留下f()。对于上下文[见下文],我想与一些预加载的包并行调用该函数。

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

2 个答案:

答案 0 :(得分:3)

f移至env

environment(f) <- env
f()
# [1] 4

注意:不希望在不同环境中评估对象,就像您在此处遇到的那样。最好将所有计划在同一环境中互相交换的对象保留在一起。

如果您不想更改f的环境,可以将以上所有内容添加到新功能中。

fx <- function(f, env) {
    environment(f) <- env
    f()
}
fx(f, env)
# [1] 4

答案 1 :(得分:0)

source('scriptfilename.R') 功能可能会有所帮助:

source('YOURPATH/scriptfilename.R')

如果文件位于其他路径中,请使用:

source()

运行create external table if not exists sample_sequence ( account_id string, receiver_id string, session_index smallint, start_epoch bigint) row format delimited fields terminated by '\t' STORED AS sequencefile location 's3://bucket/sequencefile/'; 时,它会将所有功能拉入当前环境。然后,您可以引用R脚本中包含的任何函数。

但是,我不推荐在R项目文件夹结构之外引用函数/脚本,因为如果与其他人共享R项目文件夹,链接将会中断。