使用R并行处理

问题描述:

我有一个可以简化为简单版本的r代码,如下所示。使用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没有被填充。

您尚未将对象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 
+0

我改变了代码,没有错误,但存在变数BBB没有价值。如果有什么我做错了,让我来 –