Plyr,doMC和全局变量

时间:2014-09-09 09:55:15

标签: r parallel-processing plyr domc

我使用R(3.1)和plyr以及doMC作为并行后端(据我所知,这是唯一适用于plyr的并行后端)

我的问题是如何从工作线程中写入全局变量。我有这个(非常人为的)例子:

library(doMC)
library(plyr)
registerDoMC(cores=2)

result1 = data.frame(id=c(1:3), a=NA)
result2 = data.frame(id=c(1:3), b=NA)

f = function(x){
    result1[ result1$id==x$id, "a"] <<- x$a
    result2[ result2$id==x$id, "b"] <<- x$b
}

data = data.frame(id=c(1:3), a=c(4:6), b=c(7:9))
a_ply(data, .margins=1, .fun=f, .parallel=T)

由于我想填充2个数据帧,因此我无法使用aaplyadply。该示例执行了对parallel=FALSE应该执行的操作。当我这样做时,结果data.frames保持为空。我知道我必须将全局变量导出到工作人员,我试图使用.paropts=list(.export=c("result1", "result2")),但这没有帮助....

有人知道如何将全局变量导出到doMC工作人员吗?或者是否有另一种解决方案可以在并行环境中填充两个data.frames(mazbe没有plyr?)

1 个答案:

答案 0 :(得分:1)

您无法从并行工作程序修改全局对象。这就是您需要导出data.frames的原因 - 工作人员无法访问全局环境,他们只更改导出的副本

您需要重写函数以返回某种值,稍后您可以使用它来填充data.frame。