Есть ли способ вырваться из цикла foreach?
Я использую пакет Rforeach()
с участием%dopar%
делать длинные (~ дни) расчеты параллельно. Мне бы хотелось, чтобы была возможность остановить весь набор вычислений в случае, если один из них выдает ошибку. Однако я не нашел способа добиться этого, и из документации и различных форумов я не нашел никаких признаков того, что это возможно. В частности,break()
не работает иstop()
останавливает только текущий расчет, а не весьforeach
петля.
Обратите внимание, что я не могу использовать простой цикл for, потому что в конечном итоге я хочу распараллелить это с помощью пакета doRNG.
Вот упрощенная, воспроизводимая версия того, что я пытаюсь сделать (показано здесь в%do%
, но у меня такая же проблема при использованииdoRNG
а также%dopar%
). Обратите внимание, что в действительности я хочу запустить все элементы этого цикла (здесь 10) параллельно.
library(foreach)
myfunc <- function() {
x <- foreach(k = 1:10, .combine="cbind", .errorhandling="stop") %do% {
cat("Element ", k, "\n")
Sys.sleep(0.5) # just to show that stop does not cause exit from foreach
if(is.element(k, 2:6)) {
cat("Should stop\n")
stop("Has stopped")
}
k
}
return(x)
}
x <- myfunc()
# stop() halts the processing of k=2:6, but it does not stop the foreach loop itself.
# x is not returned. The execution produces the error message
# Error in { : task 2 failed - "Has stopped"
Чего я хотел бы добиться, так это чтобы весь цикл foreach мог быть немедленно завершен при некотором условии (здесь, когдаstop()
встречается).
Я не нашел способа достичь этого сforeach
, Похоже, мне нужен способ отправить сообщение всем другим процессам, чтобы они тоже остановились.
Если не возможно сforeach
Кто-нибудь знает альтернативы? Я также пытался добиться этого сparallel::mclapply
, но это тоже не работает.
> sessionInfo()
R version 3.0.0 (2013-04-03)
Platform: x86_64-apple-darwin10.8.0 (64-bit)
locale:
[1] C/UTF-8/C/C/C/C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] foreach_1.4.0
loaded via a namespace (and not attached):
[1] codetools_0.2-8 compiler_3.0.0 iterators_1.0.6