2012-09-21 49 views
5

功能我有這樣的重複性[R片斷找不到裏面clusterApply

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下的[R 2.14.1。 MPI已安裝並正在運行。

我知道foreach結構存在類似的問題,但它允許通過.export參數手動引用函數。我找不到類似於clusterApply的東西。有沒有解決方法?

謝謝!

回答

10

您的功能沒有發送給工人。也許最好的辦法是直接導出函數:

clusterExport(cl, list("f", "g")) 
4

我認爲你的問題涉及到「可變範圍」。在Mac/Linux上,您可以選擇使用自動包含所有環境變量的makeCluster(no_core,type =「FORK」)。在Windows上,您必須使用並行套接字羣集(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) 
相關問題