我正在使用R包foreach()
和%dopar%
並行執行長(〜天)計算。我希望能夠在其中一個產生錯誤的情況下停止整套計算。但是,我還沒有找到實現這一目標的方法,從文檔和各種論壇中,我發現沒有跡象表明這是可能的。特別是,break()
不起作用,stop()
只停止當前計算,而不是整個foreach
循環。有沒有辦法擺脫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
難道不可以用'for'代替嗎? –
不,因爲最終我想使用doRNG軟件包將其並行化。 (對不起,我在原始文章中沒有說清楚:我已經編輯它來明確這一點。) –
根據您的其他意見,您可能希望讓每個子流程都可以設置「標誌」對象失敗,並使該對象可供所有子流程讀取。他們都必須有一些內部斷點或者等同的東西來定期檢查'旗幟'的價值,這樣他們都可以自行終止。 –