我刚刚开始使用foreach & parallel,在将每次迭代的输出组合起来时遇到了一些挑战。
目前,在每次迭代中,我都输出一组变量,我想将这些变量组合成一个向量,这样我就可以在所有迭代中获得一些汇总统计数据。举个例子:
foreach (s = 1:num) %dopar%{
var1 = ...
var2 = ...
var3 = ...}最后,我想要包含每个迭代产生的输出的3个向量,因此: var1 = c(var1来自s=1,var1来自s=2,var1来自s=3,.)
我查看了.combine选项,并试图创建一个附加函数,但没有成功。
发布于 2017-09-22 00:57:04
{}在foreach...%dopar%之后的行为类似于一个函数,也就是说,不管您是否显式指定它,它都会返回一个值。通常不指定它,但通过指定可以返回任何您喜欢的值。
foreach(I=1:3) %dopar% { <complicated stuff>
return(1) }
# [[1]]
# [1] 1
# [[2]]
# [1] 1
# [[3]]
# [1] 1在您的情况下,您希望返回3个向量,不幸的是,这是不可能的。
library(foreach)
library(doParallel)
cl <- makeCluster(detectCores())
registerDoParallel(cl)
foreach(I=1:8) %dopar% { v1 <- "ant"
v2 <- "pant"
return(v1, v2) }会导致以下错误:
Error in { : task 1 failed - "multi-argument returns are not permitted"但是您可以列出向量的列表,并返回值。
foreach(I=1:8, .combine=rbind) %dopar% { v1 <- "ant"
v2 <- "pant"
return(list(v1, v2)) }
# [,1] [,2]
# result.1 "ant" "pant"
# result.2 "ant" "pant"
# result.3 "ant" "pant"
# result.4 "ant" "pant"
# result.5 "ant" "pant"
# result.6 "ant" "pant"
# result.7 "ant" "pant"
# result.8 "ant" "pant"
stopCluster(cl)发布于 2017-09-21 22:40:48
使用future的解决方案
doFuture是future的foreach包装器,我更喜欢它而不是parallel。
这里我们创建了data.frame res,您可以使用res$vector1访问矢量
library(doFuture)
registerDoFuture()
plan(multiprocess)
Nlength <- 1000
Nvector <- 3
res <- foreach(i = 1:Nvector, .combine = cbind) %dopar% {
1:Nlength / pi * rnorm(1)
}
res <- data.frame(res)
colnames(res) <- paste0("vector", 1:Nvector)
dim(res)
[1] 1000 3https://stackoverflow.com/questions/46353429
复制相似问题