我不了解如何将全局定义的类传递给使用并行包生成的集群。我有一个功能:
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)
我知道可以将类和生成器函数放在一个包中,但这个问题有一个更简单的解决方案吗?
答案 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
# . . .