我刚开始使用foreach
& parallel
并且在组合每次迭代的输出时遇到了一些挑战。
目前,在每次迭代中,我输出一组我想要组合成一个向量的变量,这样我就可以获得所有迭代的一些摘要统计数据。 一个例子:
foreach (s = 1:num) %dopar%{
var1 = ...
var2 = ...
var3 = ...}
最终,我想要包含每个迭代产生的输出的3个向量,所以: var1 = c(s = 1的var1,s = 2的var1,s = 3的var1,......)
我查看了.combine选项并试图创建一个可以附加的函数,但没有成功。
答案 0 :(得分:2)
使用future
的解决方案:
doFuture
future
是foreach
的{{1}}包装,我更喜欢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 3
答案 1 :(得分:2)
{}
之后的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)