Критерий остановки в foreach

Мне нужно остановить параллельный цикл с условием, например, когда 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 возвращает пустой список.


person Wagner Jorge    schedule 01.07.2017    source источник
comment
Действительно, не очень понятно, зачем нужен внутренний цикл for.   -  person F. Privé    schedule 13.07.2017


Ответы (1)


Это происходит потому, что when(res < 1) смотрит в вызывающую среду, а не в среду внутри цикла. Итак, вы определили res <- Inf, которое никогда не бывает меньше 1.

Кроме того, ваш цикл foreach всегда возвращает 0,1, поскольку внутренний цикл всегда останавливается на I=1000, поэтому res будет равно 0,1. Неясно, что вы пытаетесь сделать или когда вы ожидаете, что цикл остановится?

person thc    schedule 01.07.2017
comment
Мне нужно использовать критерий внутри foreach для параллельной остановки, например, res < 1. res <- Inf можно удалить. - person Wagner Jorge; 01.07.2017
comment
Как я уже упоминал, ваш пример не ясен. Все ваши итерации идут к res< 1, поэтому в вашем примере ничего не закончится. - person thc; 01.07.2017
comment
Например, когда i = 1, res = 100/1, когда i = 2, res = 100/2 и т. д. res < 1, когда i = 101, в этом случае я хотел бы сломаться. - person Wagner Jorge; 01.07.2017
comment
Затем просто используйте break, поскольку вы используете обычный цикл for для перебора I. - person thc; 02.07.2017