Foreach结合输出特定的向量

时间:2017-09-21 21:27:53

标签: r foreach parallel-processing

我刚开始使用foreach& parallel并且在组合每次迭代的输出时遇到了一些挑战。

目前,在每次迭代中,我输出一组我想要组合成一个向量的变量,这样我就可以获得所有迭代的一些摘要统计数据。 一个例子:

foreach (s = 1:num) %dopar%{
var1 = ...
var2 = ...
var3 = ...}

最终,我想要包含每个迭代产生的输出的3个向量,所以: var1 = c(s = 1的var1,s = 2的var1,s = 3的var1,......)

我查看了.combine选项并试图创建一个可以附加的函数,但没有成功。

2 个答案:

答案 0 :(得分:2)

使用future的解决方案:
doFuture futureforeach的{​​{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)