2016-09-01 7 views
1

foreach()%dopar%を並列処理に使用するのが初めてで、エラーや警告の処理方法に関するいくつかの問題があります。私はforeachの()内の私のカスタマイズされたエラーメッセージを表示して試しを()を使用する場合R:foreachでエラーと警告メッセージを表示する%dopar%

  1. % 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%を使用しないと、両方のエラーメッセージが出力されます。では、両方のエラーメッセージを表示する方法は?

    test <- function(x) { 
        if (x==2) warning("Warning!") 
    } 
    
    :エラーに加えてまたはしない、警告メッセージは、上記と同様のforeach()ブロックと下test()と、例えば、印刷されていないかどうか警告があるような場合において、

  2. 警告を表示するにはどうすればいいですか?

p.s.私は単純に%dopar%内でtry(test(i))を使用すると、 "ネイティブ"エラーメッセージと警告が出力されることがわかりましたが、実際の状況で私自身のエラーメッセージを含めたいと思っています。私もtry()の代わりにtryCatch()を使ってみましたが、問題は解決しませんでした。

ありがとうございます!

+1

出力を(例えば 'doSNOW'を使用している場合は' makeCluster'の 'outfile =" "')出力する必要があるかもしれません。詳細については、[関連する質問](http://stackoverflow.com/questions/10903787/)があります。 –

+0

問題を解決するための貴重な方向を指摘していただきありがとうございます。私は今doSNOWを使用していないが、私はそれを見ている... –

答えて

1

私は問題があなたのエラー処理とドーパの誤解のビットの周りにあると思います。まず、ドーパを関数のように考える。これは、オブジェクトをデフォルトでリストに戻す必要があります(各ワーカーからのすべての出力を集め、foreach関数はこれらを集めて使用するために返します。下記の 'output_list'を参照してください)。

また、.errorhandling = 'pass'に設定すると、出力オブジェクトにエラーが戻されます(.combine = 'list'の場合のみ有効です)。エラー処理の仕組みは次のとおりです。

.errorhandlingは、タスク評価エラーの処理方法を指定します。 値が "stop"の場合、エラーが発生した場合には、停止 関数を介して実行を停止します。値が "remove"の場合、 の結果は返されず、.combine関数に渡されます。 が「合格」の場合、タスク評価によって生成されたエラーオブジェクトは、 の残りの結果に含まれます。 結合機能(指定されている場合)は、 オブジェクトを処理することができます。デフォルト値は "stop"です。

ここでは、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 
関連する問題