R>如何有条件地将doPar循环结果附加回主结果数据集

时间:2018-10-17 21:43:41

标签: r doparallel

我正在尝试实现R并行循环迭代,但不确定如何对其进行条件处理,以便在满足特定条件的情况下,仅需要将结果返回(行绑定附加)到主结果数据集即可。意思是,在某些情况下,我不希望特定的迭代步骤返回任何内容。下面的伪示例:

library(foreach)
library(doParallel)

registerDoParallel(makeCluster(detectCores() - 1))

final.result <- foreach(i = 1:100, .combine=cbind) %dopar% {
   getResultDS = functionXYZ()
   ...
   ...
   ...
   # append function result to final.result only if getResultDS[1] > 0
   if (getResultDS[1,] == 0) {
      getResultDS
   }
}
...
...
...

在这里感谢任何人的输入,谢谢!

1 个答案:

答案 0 :(得分:0)

可以通过定义忽略NA值的.combine函数来实现所描述的行为。

cbind_ignoreNA <- function(...){
    ll <- list(...)
    ll <- ll[unlist(lapply(ll, function(x) !(length(x)==1 && is.na(x))))]
    do.call("cbind", ll)                            
}

如果迭代结果不应该出现在NA的输出中,则可以返回foreach()(长度为1)。在以下示例中,迭代i=2的结果将被忽略:

library(foreach)
library(doParallel); registerDoParallel(2)
test <- foreach(i=1:4, .combine=cbind_ignoreNA) %dopar% {
    if(i==2)
        r <- NA
    else
        r <- i:(i+3)
    r
}
test
      [,1] [,2] [,3]
[1,]    1    3    4
[2,]    2    4    5
[3,]    3    5    6
[4,]    4    6    7