Foreach保存多类数据R

时间:2018-07-18 09:47:55

标签: r foreach parallel-processing parallel.foreach doparallel

我想在R的foreach循环中的列表中保存多个类。我这里有一个可复制的示例。

cl <- makeCluster(4)
registerDoParallel( cl)
start_time <- Sys.time()

acomb <- function(...) abind(..., along=3)
results <-foreach(i = 
1:10,.combine="acomb",.multicombine=TRUE,
  .packages=c('doParallel','foreach','base','abind')) %dopar% {
a = array(data=sample(rnorm(100000, mean=i, sd=1),9000),dim=c(3,3,1000))
aperm(a,c(2,1,3))
}
stopCluster(cl)
end_time <- Sys.time()
end_time - start_time

这给了我3*3*10000 array的输出。

我得到的结果是一个很好的数组,但是,我希望它们的总和和均值也可以作为向量存储在列表中。最终结果应该是这样的:

list(data=results,mean=mean,sum=sum)

其中数据应为3*3*10000,均值应为10000元素的向量,并且sum也应为10000元素的向量。我希望这与foreach循环一起使用。

我也搜索了一下,发现saving multiple outputs in foreach。但是,我无法将其修改为所需的内容。

1 个答案:

答案 0 :(得分:1)

在foreach中返回一个列表,不要直接合并:

results2 <- foreach(i = 1:10, .packages=c('doParallel','foreach','base','abind')) %dopar% {
                    a = array(data=sample(rnorm(100000, mean=i, sd=1),9000),dim=c(3,3,1000))
                    res <- aperm(a,c(2,1,3))
                    sum <- apply(res, 3, sum)
                    list(data = res, sum = sum, mean = sum / prod(dim(res)[-3]))
                  }

然后合并:

library(purrr)
final <- list(data = do.call(acomb, map(results2, "data")), 
              sum  = do.call(c, map(results2, "sum")), 
              mean = do.call(c, map(results2, "mean")))