我正在使用 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