2012-04-10 8 views
22

私はいくつかのコアでコードを実行しようとしています(私はsnowparallelパッケージを試しました)。parSapplyグローバル環境でオブジェクトを見つけることができません

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

明らかにparSapplyは、地球環境にyを見つけていない:私は、最後の行がエラーを返し

cl <- makeCluster(2) 
y <- 1:10 
sapply(1:5, function(x) x + y) # Works 
parSapply(cl, 1:5, function(x) x + y) 

を持っています。これを回避する方法はありますか?ありがとう。

答えて

20

ノードは、マスター上のグローバル環境でyについて知りません。あなたは何とかそれらに伝える必要があります。

library(parallel) 
cl <- makeCluster(2) 
y <- 1:10 
# add y to function definition and parSapply call 
parSapply(cl, 1:5, function(x,y) x + y, y) 
# export y to the global environment of each node 
# then call your original code 
clusterExport(cl, "y") 
parSapply(cl, 1:5, function(x) x + y) 
5

関数function(x) x + yが作成される場所本当の問題はあるもののparSapplyは、関数内から呼び出された場合、あなたの例では、動作することを言及する価値があります。たとえば、次のコードは正常に動作します:

library(parallel) 
fun <- function(cl, y) { 
    parSapply(cl, 1:5, function(x) x + y) 
} 
cl <- makeCluster(2) 
fun(cl, 1:10) 
stopCluster(cl) 

地球環境から作成された機能が一緒にシリアライズされていない間、他の機能で作成された関数は、それらが作成されたローカル環境と一緒にシリアライズされているためです地球環境との関係これは時に便利ですが、問題を認識していないとさまざまな問題につながる可能性があります。

関連する問題