【问题标题】:Stop criterion in foreachforeach 中的停止标准
【发布时间】:2017-07-01 02:31:02
【问题描述】:

我需要用一个条件来停止并行循环,例如,当res < 1 时。 MWE 由下面的代码给出

library(foreach)
library(doParallel)    
I <- 1000
L <- 1000
res <- Inf    
cores <- detectCores()
cluster <- makeCluster(cores)
registerDoParallel(cluster)
out <- foreach(l = 1:I,.packages = "cec2013") %dopar% {
    for(i in 1:I){
       res <- 100/i
     }
   out <- res
   out
}
out

我想解决的问题是

out <- foreach(l = 1:I,.packages = "cec2013")%:%when(res < 1)  %dopar% {
    for(i in 1:I){
       res <- 100/i
     }
   out <- res
   out
}
out

但是out 返回一个空列表。

【问题讨论】:

  • 确实,还不是很清楚为什么需要内部 for 循环。

标签: r foreach parallel-processing parallel-foreach


【解决方案1】:

发生这种情况的原因是因为when(res &lt; 1) 查看的是调用环境,而不是循环内的环境。所以你定义了res &lt;- Inf,它永远不会小于1。

此外,您的 foreach 循环始终返回 0.1,因为内部循环始终在 I=1000 处停止,因此 res 将为 0.1。目前尚不清楚您要做什么,或者您希望循环何时停止?

【讨论】:

  • 我需要在foreach 中使用一个标准来停止并行,例如res &lt; 1res &lt;- Inf 可以删除。
  • 正如我所提到的,您的示例并不清楚。您的所有迭代都转到res&lt; 1,因此在您的示例中什么都不会完成。
  • 比如当i = 1res = 100/1,当i = 2res = 100/2,等等res &lt; 1i = 101,在这种情况下我想打破。
  • 然后只需使用break,因为您使用的是普通的for循环来迭代I
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
  • 2015-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多