使用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
我改变了代码,没有错误,但存在变数BBB没有价值。如果有什么我做错了,让我来 –