2013-09-10 7 views
22

sink()関数を使用して、R出力をファイルに変換することができます。シンクがファイルを解放しない

未解決のシンクをすべて閉じる簡単なコマンドがありますか?

以下、私の質問で詳しく説明します。

私のRスクリプトがRスクリプトでsink()を開きますが、スクリプトがsink()を閉じる前に発生しているRスクリプトにエラーがあるとします。 Rスクリプトを複数回実行してエラーを修正しようとしています。最後に、すべてのシンクを閉じてコンソールに印刷したいと思います。どうすればいいですか?

最後に、具体性のために、私が直面する問題を説明するためにMWEを提供します。

まず、Rスクリプトsink-closing.Rにエラーがあります。

sink('sink-closing.txt') 

foo <- function() { 
    cat(sprintf('Hello world! My name is %s\n', 
       a.variable.that.does.not.exist)) 
} 

foo() 

sink() 

次に、私はバグを見つけて修正しようとして、誤って3回言って、R-スクリプトを複数回source

> source('~/Dropbox/cookbook/r-cookbook/sink-closing.R') 
Error in sprintf("Hello world! My name is %s\n", a.variable.that.does.not.exist) : 
    object 'a.variable.that.does.not.exist' not found 

ここで、Rスクリプトをデバッグしていて、コンソールに印刷したいとします。以前のシンクを閉じるためにsink()に何度も呼び出すことができます。 3回呼び出すと、前と同じようにコンソールに最後に印刷することができます。しかし、私はどのくらいのシンクを閉じる必要があるのか​​分かりますか?

+1

'sink.number'を使用できますか? – mnel

答えて

28

sink.number()を使用すると、すでに設定されているダイバーシオン数を教えてから、sinkを何度も呼び出すことができます。機能にそれを置くと、あなたは、@ mnelさんのコメントに基づいて、この

sink.reset <- function(){ 
    for(i in seq_len(sink.number())){ 
     sink(NULL) 
    } 
} 
+1

ヘルプファイルのドキュメントをすべて読み込むためのもう一つのWIN! :-) –

9

を持つことができます:

sinkall <- function() { 
    i <- sink.number() 
    while (i > 0) { 
    sink() 
    i <- i - 1 
    } 
} 

は、開いているすべてのシンクを閉じる必要があります。

開いているデバイスの数がどこにも報告されないデバイスやプロットを扱うときにも、この問題が発生することがあります。より一般的な場合については、これを使用することができます

stopWhenError <- function(FUN) { 
    tryCatch({ 
    while(TRUE) { 
     FUN() 
    } 
    }, warning = function(w) { 
    print("All finished!") 
    }, error = function(e) { 
    print("All finished!") 
    }) 
} 

stopWhenError(sink) # for sink. 
stopWhenError(dev.off) # close all open plotting devices. 

EDIT: sinkはそれが永遠に実行されないように、私はおっと、コードを変更したので、警告ではないエラーがスローされます!

+0

'tryCatch'を使うことは良いことです。 –

23
closeAllConnections() # ......................... 
+4

...なぜ、シンクのヘルプファイルにリンクされていないのですか? – Dason

+0

彼らは接続の一種であるという事実を正確に隠さなかった。そして 'connection'ページへのリンクがあります。だから、 '?showConnections'への2ホップリンクになってしまいました。 –

+7

@Dason - おそらく、 'closeAllConnections'は、現在開いている 'シンク'だけでなく、開いている他の接続を閉じるので、この目的のために使うには非常に粗末なツールです。 –

関連する問題