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)

1 つ目parLapplyは期待どおりに平均を実行して計算します。2番目parLapplyは失敗します:

Error in checkForRemoteErrors(val) : 
  4 nodes produced errors; first error: object 'i' not found
4

1 に答える 1

2

から?source:

source は、指定されたファイル、URL、または接続からの入力を R に受け入れさせます。ファイルの最後に到達するまで、そのファイルから入力が読み取られて解析されます。次に、解析された式が、選択された環境で順次評価されます。

手がかりは、「選択された環境」への言及と、次のlocal議論の覗き見にありますsource

解析された式が評価される場所を決定する、TRUE、FALSE、または環境。FALSE (デフォルト) はユーザーのワークスペース (グローバル環境) に対応し、TRUE は source が呼び出される環境に対応します。

これは、source(code.R)デフォルトでは、スクリプトが 内の個々の関数環境ではなく、グローバル環境で読み取られて解析されることを意味しますparLapply

必要な動作を取得するには:

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

于 2013-04-16T04:18:07.613 に答える