为什么在R的并行函数中获取脚本会失败?

时间:2013-04-16 04:14:25

标签: r parallel-processing

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

1 个答案:

答案 0 :(得分:2)

来自?source

  

source会导致R接受来自指定文件或URL的输入   连接。从该文件读取并解析输入,直到结束   到达文件,然后评估解析的表达式   顺序在选择的环境

线索是提到“选择的环境”,然后查看local的{​​{1}}参数:

  

TRUE,FALSE或环境,确定解析的位置   表达式被评估。 FALSE(默认值)对应于   用户的工作区(全局环境)和对环境为真   来自哪个来源。

这意味着source导致默认情况下在全局环境中读取和解析脚本,而不是source(code.R)中的单个函数环境。

要获得所需的行为:

parLapply