2014-12-03 90 views
3

比方說,我想用foreachdoParallel包返回不同尺寸的兩個數據幀的列表如下所示:輸出列表

a<-NULL 
b<-NULL 
for(i in 1:100){ 
    a<-rbind(a,data.frame(input=i,output=i/2)) 
    if(i > 5){ 
    b<-rbind(b,data.frame(input=i,output=i^2)) 
    } 
} 
list(a,b) 

由於foreach回報一個對象,沒有(至少對我來說)明顯的方式做到foreach以上。

注意:這是一個非常簡化版本的問題,我實際上正在使用,所以通過使用lapply(或沿着這些線路)解決問題將不起作用。我的問題的精神是如何與foreach做到這一點。

回答

5

我想通了。您必須定義您自己的功能,以完全按照您的方式組合列表。

#takes an arbitrary number of lists x all of which much have the same structure  
comb <- function(x, ...) { 
     mapply(rbind,x,...,SIMPLIFY=FALSE) 
} 

foreach(i=1:10, .combine='comb') %dopar% { 
     a<-rbind(a,data.frame(input=i,output=i/2)) 
     if(i > 5){ 
     b<-rbind(b,data.frame(input=i,output=i^2)) 
     } 
     list(a,b) 
} 
+2

我喜歡你的組合函數,但我認爲你需要從foreach循環的主體中刪除rbind調用。另外,如果使用foreach'.multicombine = TRUE'選項,它會更有效,因爲在您的示例中'comb'將被調用一次而不是9次。 – 2014-12-05 03:06:11