R:如何将包提供的方法导出到 PSOCK 集群?
R: How can I export methods provided by a package to a PSOCK cluster?
在 R
中,我有一个矩阵列表,想对列表中的矩阵应用汇总函数。矩阵代表社交网络,因此我需要应用 ergm
包提供的一些专门的汇总函数。这些汇总统计信息包含在汇总方法中。我可以编写一个函数作为此摘要方法的包装器,并使用 lapply
将该函数应用于矩阵列表。
但是,当我尝试使用 parallel
包中的 parLapply
或 parSapply
对其进行并行化时,结果看起来很奇怪。当我导出 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!
不要导出包中定义的函数,您应该使用类似以下的方法将包加载到 worker 中:
clusterEvalQ(cl, library("ergm"))
您应该始终加载 worker 函数所需的所有包,因为它们不会仅仅因为包已被 master 加载就自动加载。
在 R
中,我有一个矩阵列表,想对列表中的矩阵应用汇总函数。矩阵代表社交网络,因此我需要应用 ergm
包提供的一些专门的汇总函数。这些汇总统计信息包含在汇总方法中。我可以编写一个函数作为此摘要方法的包装器,并使用 lapply
将该函数应用于矩阵列表。
但是,当我尝试使用 parallel
包中的 parLapply
或 parSapply
对其进行并行化时,结果看起来很奇怪。当我导出 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!
不要导出包中定义的函数,您应该使用类似以下的方法将包加载到 worker 中:
clusterEvalQ(cl, library("ergm"))
您应该始终加载 worker 函数所需的所有包,因为它们不会仅仅因为包已被 master 加载就自动加载。