我想在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。但是,我无法将其修改为所需的内容。
答案 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")))