私は 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)
1 つ目parLapply
は期待どおりに平均を実行して計算します。2番目parLapply
は失敗します:
Error in checkForRemoteErrors(val) :
4 nodes produced errors; first error: object 'i' not found