我有一个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没有被填充。
答案 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