我正在使用R的基本并行库,其中源自parLapply
脚本。在一种情况下,如果我将代码内联,结果是预期的。在另一种情况下,如果我通过调用指向具有完全相同代码的脚本的source()
来替换代码,则代码将失败。
可重现的例子:
require(parallel)
# generate a list of random vectors with increasing means
set.seed(1)
x <- lapply(1:4, function(i) rnorm(10,i,1))
# create cluster and export the above list
cl <- makePSOCKcluster(4)
clusterExport(cl, varlist=c("x"))
# use inline code first
means.inline <- parLapply(cl, 1:length(x), function(i) {
values <- x[[i]]
mean(values)
})
# now call the exact same code, but sourced from a separate script
means.source <- parLapply(cl, 1:length(x), function(i) {
source("code.R")
})
stopCluster(cl)
code.R
的内容与第一个parLapply中的代码完全相同:
values <- x[[i]]
mean(values)
第一个parLapply
执行并按预期计算均值。第二个parLapply
失败:
Error in checkForRemoteErrors(val) :
4 nodes produced errors; first error: object 'i' not found
答案 0 :(得分:2)
来自?source
:
source会导致R接受来自指定文件或URL的输入 连接。从该文件读取并解析输入,直到结束 到达文件,然后评估解析的表达式 顺序在选择的环境。
线索是提到“选择的环境”,然后查看local
的{{1}}参数:
TRUE,FALSE或环境,确定解析的位置 表达式被评估。 FALSE(默认值)对应于 用户的工作区(全局环境)和对环境为真 来自哪个来源。
这意味着source
导致默认情况下在全局环境中读取和解析脚本,而不是source(code.R)
中的单个函数环境。
要获得所需的行为:
parLapply