10

グリッド エンジンを使用して R スクリプトを実行しています。このセットアップでは、STDERR は真剣に受け止められるため、クリーンな状態を保ち、STDERR に表示されるのは、実際の/重大な/致命的なエラーのみにしたいと考えています。

問題は、私の R スクリプトがさまざまな STDERR メッセージを生成することですが、これは深刻な警告ではありません。たとえば、scan読み取った項目の数を STDERR に出力しているようです。

(R 内から) STDERR を STDOUT にリダイレクトできますか?

4

3 に答える 3

7

のヘルプ ページを参照してくださいsink()

'sink' は、R 出力を接続に転送します。'file' が文字列の場合、その名前のファイル接続は、迂回中に確立されます。

通常の R 出力 (接続 'stdout' へ) は、​​デフォルトの 'type = "output"' によって迂回されます。プロンプトと (ほとんどの) メッセージのみが引き続きコンソールに表示されます。'stderr()' に送信されたメッセージ ('message'、'warning'、および 'stop' からのメッセージを含む) は、'sink(type = "message")' によって転送できます (以下を参照)。

于 2010-11-06T13:07:38.217 に答える
1

@Dirkはすでに答えを提供していますがstdout()、STDOUTへの接続を取得するために使用できることを追加します。これを任意の出力関数で使用して、そこに出力を送信できます。

于 2010-11-06T13:10:16.290 に答える
0

エラーを分離する 1 つの方法は、try catch を使用することです。メイン ブロックではすべてが stdout に送信され、コードによってスローされたエラーはすべてキャッチされ、stderr に送信されます。

これは、エラー メッセージのログではなく、コードでスローされたエラーのみを処理しますが、解決策になる可能性があります。

result = tryCatch({
    sink(stdout(), type = "message") # sink all messages, warnings, errors to stdout
    
    message('Starting! This message will go to stdout')
    warning('Warning! This message will go to stdout')
    error('Error! This message will ALSO go to stdout')
    
    #Call your code here, e.g.
    #...
    stop('An error is thrown', call.=FALSE)
    #...

}, error = function(e) {
    sink(NULL, type="message") # close the sink

    #Now sink closed, you can re-raise the error, and it will be directed to sterr:
    stop(paste0('Error: ', e), call.=FALSE)
})
于 2021-03-12T21:18:03.807 に答える