1

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

1 回答 1

2

来自?source

source 使 R 接受来自指定文件或 URL 或连接的输入。从该文件读取并解析输入,直到到达文件末尾,然后在所选环境中按顺序评估解析的表达式。

线索是提到“选择的环境”,然后看一下以下的local论点source

TRUE、FALSE 或环境,确定解析表达式的评估位置。FALSE(默认值)对应于用户的工作空间(全局环境),TRUE 对应于调用源的环境。

这意味着source(code.R)默认情况下会在全局环境中读取和解析脚本,而不是在parLapply.

要获得所需的行为:

source("code.R", local=TRUE)

于 2013-04-16T04:18:07.613 回答