使用R parapply进行并行处理

时间:2017-10-11 11:46:26

标签: r parallel-processing lapply

我有一个r代码,可以简化为简单版本,如下所示。

cl <- parallel::makeCluster(2, type="SOCK")
b<-data.frame(c(1,1,2,2,3,3,4,4,7,7,9,9,11,11,12,12,13,13,14,14))
colnames(b)<-c("col1")
b_uni<-unique(b)
clusterExport(cl,"b_uni")

bbb <- parallel::parLapply(cl,1:nrow(b_uni), fun=function(i,b) {
e<-b[b$col2==b_uni[i,1],]
a<-e+10
return(a)
}b=b)

c <- na.omit(do.call(rbind, bbb))

为了减少循环次数,我只在b中运行唯一的组合。但是变量bbb和c没有被填充。

1 个答案:

答案 0 :(得分:3)

您尚未将对象b传递给parLapply()。在lapply中,您可以访问全局环境中的对象,在parLapply()中您必须传递它们。因此,如果您将代码更改为:

bbb <- parallel::parLapply(cl,1:nrow(b_uni), fun=function(i,b) {
  e<-b[b$col2==b_uni[i,1],]
  a<-e+10
  return(a)
}, b = b)

它会起作用。

编辑: bbb为空的原因是b没有名为col2的列。

bbb <- parallel::parLapply(cl,1:nrow(b_uni), fun=function(i,b) {
  e<-b[b$col1==b_uni[i,1],]
  a<-e+10
  return(a)
}, b = b)

如果将其更改为col1,则会显示长度为2的向量列表:

lengths(bbb)
[1] 2 2 2 2 2 2 2 2 2 2