2016-09-01 48 views
1

我是使用foreach()%dopar%並聯的新手,我在處理錯誤或警告方面遇到了一些問題。R:在foreach中顯示錯誤和警告信息%dopar%

  1. ,當我的foreach()內使用try()與我的自定義錯誤消息%dopar%, 「本土」 的錯誤信息不會顯示出來:

    test <- function(x) { 
        if (x==2) "a"/2 
    } 
    
    foreach(i=1:3) %dopar% { 
        tryout <- try(test(i)) 
        if (class(tryout)=="try-error") print("Error!") 
    } 
    

    在這種情況下,「原生「錯誤消息:Error in "a"/2 : non-numeric argument to binary operator沒有顯示,並且只有來自try()錯誤捕獲的Error!將被打印。但是,如果不使用foreach()%dopar%,則會打印這兩個錯誤消息。那麼如何讓這兩個錯誤消息顯示出來?

  2. 在上述情況下,當存在警告,是否附加到錯誤或沒有,警告消息不打印,例如具有相同的foreach()作爲上述嵌段和低於test()

    test <- function(x) { 
        if (x==2) warning("Warning!") 
    } 
    

    那麼如何顯示警告?

p.s.我發現如果我在%dopar%內簡單地使用try(test(i)),那麼將會打印「native」錯誤消息和警告,但我確實希望在真實情況中包含我自己的錯誤消息。我也嘗試使用tryCatch()而不是try(),但它沒有解決問題。

謝謝!

+1

您可能需要告訴並行後端您想要輸出(例如,如果您使用'doSNOW',則參數''outfile =「'makeCluster''')。有一個[相關的問題](http://stackoverflow.com/questions/10903787/)與更多的細節。 –

+0

謝謝您指出解決問題的寶貴方向。我現在不使用doSNOW,但我正在研究這個... –

回答

1

我認爲這個問題是圍繞着你的錯誤處理和對dopar的一點誤解。首先,將dopar看作一個函數。它必須將一個對象默認返回給用戶列表(它收集每個worker的所有輸出,foreach函數收集這些並返回它們使用,參見下面的'output_list')。

您也可以設置.errorhandling ='pass',它會將錯誤返回給輸出對象(注意大概只有在.combine ='list'時纔有效)。以下是錯誤操作的工作方式:

.errorhandling指定應如何處理任務評估錯誤。 如果值爲「停止」,則如果發生錯誤,則通過停止 函數停止執行。如果值爲「remove」,那麼該任務的結果將不會返回,或傳遞給.combine函數。如果 它是「通過」,則任務評估生成的錯誤對象將包含在其餘結果中,其中包括 。假定 組合函數(如果指定)將能夠處理錯誤 對象。默認值是「停止」。

這是一個如何在foreach中設置tryCatch的例子。請注意,錯誤現在存儲在output_list中。

output_list = foreach(i=1:3, .errorhandling='pass') %dopar% { 
result <- tryCatch({ 
    object_that_doesnt_exist[i]}, 
    warning = function(war) { 
     return('a warning')}, 
    error = function(err) { 
     return('an error')}, 
    finally = { 
     return('other things') 
    }) # END tryCatch 

    return(result) # return your result to outputlist 
} 

output_list