从`parallel`包中的非基本R包调用函数,而不在函数中对它们进行编码

时间:2014-04-16 00:26:54

标签: r parallel-processing

让我说我正在尝试运行以下代码

library(gregmisc)
library(parallel)
myfunction <- function(x){
  combinations(10, x, 1:10)
}
cl <- makeCluster(getOption("cl.cores", 2))
parLapply(cl, 3, myfunction)

我收到了错误

#Error in checkForRemoteErrors(val) : 
#one node produced an error: could not find function "combinations"

因此,如果我在函数库中使用“gregmisc”软件包,它将起作用

myfunction <- function(x){
  library(gregmisc)
  combinations(10, x, 1:10)
}
cl <- makeCluster(getOption("cl.cores", 2))
parLapply(cl, 3, myfunction)

问题是,如何避免在函数中编写程序包?

我在herehere

中看到类似的问题已经被问到“雪”和“降雪”了

但我无法让它为“并行”包

工作

我尝试过(没有成功)

library(snow)
library(snowfall)
sfExport(list=list("combinations"))
sfLibrary(gregmisc)
clusterEvalQ(cl, library(gregmisc))

2 个答案:

答案 0 :(得分:3)

我在 gregmisc 中看不到任何combinations功能。这可能是你的实际问题吗?

使用clusterEvalQ()在每个节点上加载包应该有效,并且始终对我有效。 以下代码几乎逐字逐句地从vignette("parallel")的第8页解除:

require(parallel)
cl <- makeCluster(4)
junk <- clusterEvalQ(cl, library(boot)) ## Discard result

答案 1 :(得分:2)

各个节点中的环境不同。尝试明确指定包:

myfunction <- function(x){
  gregmisc::combinations(10, x, 1:10)
}