14

私はこの再現可能なRスニペットを持っています

rm(list=ls())

library(doSNOW)

f <- function(a, b) a+b
g <- function(c) f(c*c, c+c)

v <- c(1, 2, 3, 4, 5, 6)

cl <- makeMPIcluster(1)
cat( clusterApply(cl, v, g) )
stopCluster(cl)

次のエラーメッセージが表示されます。

Error in checkForRemoteErrors(val) : 
  6 nodes produced errors; first error: could not find function "f"

UbuntuでR2.14.1を使用しています。MPIがインストールされ、機能しています。

foreach構文にも同様の問題があることは知っていますが、.exportパラメーターを使用して関数を手動で参照できます。clusterApplyに似たものは見つかりませんでした。これに対する回避策はありますか?

ありがとう!

4

2 に答える 2

24

あなたの機能は労働者に送られませんでした。おそらく、これを行うための最良の方法は、関数を直接エクスポートすることです。

clusterExport(cl, list("f", "g"))
于 2012-09-21T14:29:42.360 に答える
9

あなたの問題は「可変スコープ」に関係していると思います。Mac / Linuxでは、すべての環境変数を自動的に含むmakeCluster(no_core、type = "FORK")を使用するオプションがあります。Windowsでは、基本パッケージのみがロードされた状態で開始するParallel Socket Cluster(PSOCK)を使用する必要があります。したがって、並列関数を機能させるために含める変数とライブラリを常に正確に指定します。clusterExport()とclusterEvalQ()は、必要な変数とパッケージをそれぞれ表示する関数に必要です。clusterExport後の変数への変更は無視されることに注意してください。あなたの問題に戻ってください。次のように使用する必要があります。

rm(list=ls())
library(doSNOW)
f <- function(a, b) a+b
g <- function(c) f(c*c, c+c)
v <- c(1, 2, 3, 4, 5, 6)
cl <- makeMPIcluster(1)
# insert code here
clusterExport(cl, list("f", "g"))
# insert clusterEvalQ(cl, library(...)) if you need library for function to parallel
cat( clusterApply(cl, v, g) )
stopCluster(cl)
于 2016-06-11T13:30:31.910 に答える