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 下使用 R 2.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 上,您必须使用仅加载基本包的并行套接字集群 (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 回答