R并行编程与全局定义S4类

时间:2016-10-28 11:51:09

标签: r parallel-processing

我不了解如何将全局定义的类传递给使用并行包生成的集群。我有一个功能:

funs = "testClass"
fun = function(x) testClass(test = x^2)
testClass = function(test) return(test)

cl <- parallel::makeCluster(2, outfile='')
parallel::clusterExport(cl = cl, varlist = funs, envir = globalenv())
res <- parallel::parLapply(cl = cl, X = seq_len(10L), fun = fun)
parallel::stopCluster(cl)
res

同样的方法不适用于班级:

funs = "testClass"
fun = function(x) testClass(test = x^2)
testClass = setClass("testClass", slots = c(test = "numeric"))

cl <- parallel::makeCluster(2, outfile='')
parallel::clusterExport(cl = cl, varlist = funs, envir = globalenv())
res <- parallel::parLapply(cl = cl, X = seq_len(10L), fun = fun)
parallel::stopCluster(cl)

我知道可以将类和生成器函数放在一个包中,但这个问题有一个更简单的解决方案吗?

1 个答案:

答案 0 :(得分:1)

定义S4类实际上会修改全局环境中的一些隐藏元数据对象。仅仅将生成器功能复制到从属节点是不够的;您必须在每个节点上执行类定义语句。 (好吧,你可以复制那些元数据对象,但那只是在惹麻烦。)

cl <- parallel::makeCluster(2, outfile='')
parallel::clusterEvalQ(cl, expr={
    testClass <- setClass("testClass", slots = c(test = "numeric"))
})
res <- parallel::parLapply(cl = cl, X = seq_len(10L), fun = fun)

res

# [[1]]
# An object of class "testClass"
# Slot "test":
# [1] 1
#
# [[2]]
# An object of class "testClass"
# Slot "test":
# [1] 4
# . . .