4

假设我想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.

4

2 回答 2

8

我想到了。您必须定义自己的函数,以完全按照您想要的方式组合列表。

#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)
}
于 2014-12-03T19:46:58.717 回答
0

将 data.table rbindlist 版本添加到 NewNameStat 的答案:

#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=function(x,...) mapply(function(...) data.table::rbindlist(list(...), fill = TRUE),x,...,SIMPLIFY=FALSE)) 
      %dopar% {
      a<-rbindlist(list(a,data.table(input=i,output=i/2)))
      if(i > 5){
        b<-rbindlist(list(b,data.table(input=i,output=i^2)))
      }
      list(a,b)
}
于 2019-12-03T22:57:34.157 回答