无法在clusterApply中找到函数

时间:2012-09-21 14:13:12

标签: r

我有这个可重复的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下使用R 2.14.1。 MPI已安装并正常运行。

我知道foreach构造存在类似的问题,但它允许通过.export参数手动引用函数。我找不到与clusterApply类似的东西。有解决方法吗?

谢谢!

2 个答案:

答案 0 :(得分:16)

您的功能未发送给工作人员。也许最好的方法是直接导出函数:

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

答案 1 :(得分:8)

我认为你的问题与“变量范围”有关。在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)