R:如何将包提供的方法导出到PSOCK群集?

Phi*_*eld 5 parallel-processing r

R,我有一个矩阵列表,并希望将摘要函数应用于列表中的矩阵.矩阵代表社交网络,因此我需要应用ergm包提供的一些专门的汇总功能.这些摘要统计信息包含在摘要方法中.我可以编写一个函数作为这个汇总方法的包装器,并lapply用于将函数应用于矩阵列表.

但是,当我尝试通过使用parLapplyparSapplyparallel包中并行化时,结果看起来很奇怪.当我导出该summary.statistics函数时,我甚至会收到一条错误消息.

我是否必须将ergm包提供的摘要方法导出到群集对象?如果是这样,怎么样?以下代码是一个独立的示例.

library("ergm")
library("parallel")

# create list of matrices
m <- matrix(rbinom(900, 1, 0.1), nrow = 30)
l <- list(m, m, m, m, m)

# write wrapper function that computes results
fun <- function(mat) {
  s <- summary(mat ~ edges + dsp(1))
  return(s)
}

cl <- makePSOCKcluster(2)  # create cluster object

test1 <- sapply(l, fun)  # works!
test2 <- parSapply(cl, l, fun)  # problem: results look weird!

clusterExport(cl, varlist = "summary.statistics")
test3 <- parSapply(cl, l, fun)  # problem: says method is not applicable!
Run Code Online (Sandbox Code Playgroud)

Ste*_*ton 12

您应该使用以下内容在工作程序中加载包,而不是导出在包中定义的函数:

clusterEvalQ(cl, library("ergm"))
Run Code Online (Sandbox Code Playgroud)

您应该始终加载worker函数所需的所有软件包,因为它们不会因为软件包已由主服务器加载而自动加载.