2017-10-11 173 views
1

我有一個可以簡化爲簡單版本的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沒有被填充。

回答

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 
+0

我改變了代碼,沒有錯誤,但存在變數BBB沒有價值。如果有什麼我做錯了,讓我來 –