2017-10-11 10 views
1

私は以下のように簡単なバージョンに単純化することができるrコードを持っています。R parapplyを使用した並列処理

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

bparLapply()に渡していません。 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における値はありません。私が間違っていることが他にもあれば教えてください –

関連する問題