2012-04-10 50 views
22

我試圖運行幾個內核代碼(我試過snowparallel兩種封裝)。我有parSapply沒有找到對象在全球環境

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

最後一行將返回錯誤:

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

顯然parSapply沒有在全球環境中尋找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

值得一提的是,你的例子會工作,如果parSapply從一個函數中調用,但真正的問題是創建功能function(x) x + y地方。例如,下面的代碼工作正常:

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

這是因爲,在其他功能創建功能與它們被創建的本地環境一起被序列化,而從全球環境中創建功能不沿着序列與全球環境。這有時可能是有用的,但是如果你不知道這個問題也可能導致各種問題一個。