gpt4 book ai didi

r - 并行 plyr 中的奇怪环境行为

转载 作者:行者123 更新时间:2023-12-02 08:13:26 25 4
gpt4 key购买 nike

最近,我在工作区创建了一个对象factor=1,不知道base包中有一个函数factor .

我想做的是在并行循环中使用变量factor,例如,

library(plyr)
library(foreach)
library(doParallel)

workers <- makeCluster(2)
registerDoParallel(workers,cores=2)

factor=1

llply(
as.list(1:2),
function(x) factor*x,
.parallel = TRUE,
.paropts=list(.export=c("factor"))
)

然而,这会导致一个错误,我花了很长时间才理解。看起来,plyr 在其环境 exportEnv 中创建了对象 factor,但使用 base::factor 而不是用户提供的对象。请参阅以下示例

llply(
as.list(1:2),
function(x) {
function_env=environment();
global_env=parent.env(function_env);
export_env=parent.env(global_env);
list(
function_env=function_env,
global_env=global_env,
export_env=export_env,
objects_in_exportenv=unlist(ls(envir=export_env)),
factor_found_in_envs=find("factor"),
factor_in_exportenv=get("factor",envir=export_env)
)
},
.parallel = TRUE,
.paropts=list(.export=c("factor"))
)

stopCluster(workers)

如果我们检查 llply 的输出,我们会发现行 factor_in_exportenv=get("factor",envir=export_env) 不会返回 1(对应用户提供的对象)而是base::factor的函数定义。

问题 1) 我如何理解这种行为?我预计输出为 1

问题 2)如果我将新值分配给另一个包中已定义的对象(例如在我的情况下 factor)?

最佳答案

llply 函数在底层调用“foreach”。 Foreach 使用“parant.frame()”来确定要评估的环境。 llply 中的 parant.frame 是什么?这是 llply 的函数环境,没有定义因子。

为什么不直接使用 foreach 而不是 llply 呢?

library(plyr)
library(foreach)
library(doParallel)

workers <- makeCluster(2)
registerDoParallel(workers,cores=2)

factor=1
foreach(x=1:2) %dopar% {factor*x}

请注意,您甚至不需要 .export 参数,因为在这种情况下它会自动执行此操作。

关于r - 并行 plyr 中的奇怪环境行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17840167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com