2012-01-24 1 views
3

私は間違った場所で探していない限り、これについてのほとんどのドキュメントがないようです。 .Rhistoryの名前を.RHistoryとすべての警告を保存する()

R --no-save <myfile1.r>& out1.txt 

私は同時に実行されているいくつかのRスクリプトを使用している場合は、私は、各ファイルの末尾にsavehistory("history1.Rhistory")などを入れなければいけないのか、次のことができます。私は、Unix上のコマンドラインでRを実行していますよファイルはコマンドライン引数で与えられますか?

また、すべての警告はRワークスペースに保存されているものとします。しかし、最後の50だけが今までに見えるようです(There were 50 or more warnings (use warnings() to see the first 50)) - すべてのの警告を保存する方法はありますか?

+0

私はあなたが単純に(確かに歴史がちょうど 'ソースになり、スクリプトを実行している場合は、スクリプト –

+2

この種のRscriptの代わりにRを使用したいと思いますmyfile1.r) '。なぜあなたはそれを保存する必要がありますか? –

+0

申し訳ありません - 私は自分自身を明確にしませんでした。私は実際には履歴を保存するのではなく、ワークスペースを保存する方法を意味しました!それは質問を校正しないために私に教えてくれる... – ChrisW

答えて

3

私はまた、すべての警告がRのワークスペース

いやに保存されていることを前提としています。 ?warningsから:

It is undocumented where ‘last.warning’ is stored nor that it is 
visible, and this is subject to change. Prior to R 2.4.0 it was 
stored in the workspace, but no longer. 

それ以来、undocumentedly baseenv()に変数last.warningに格納されていますが、常にそうであることに依存していません。 (まだ警告が表示されていなければ、その変数は存在しないことにも注意してください)。代わりにwarnings()で最後の警告にアクセスすることになっています。

すべての警告を保存する方法はありますか?

明らかにわかりません。 50件の警告が一度に心配することが多いという理論です。警告が誤っていると思われる場合は、最初の50を読んで問題を解決するか、問題のコードをsuppressWarningsにラップし、次のセットを処理してください。

3

する場合すべての警告を、おそらく外部ファイルに保存する場合は、実行中のコードをwithCallingHandlers()の呼び出しでラップすることができます。これにより、警告条件用の「ハンドラ」を定義することができます。ハンドラは、警告が発生するたびに実行される関数です。あなたはそれが渡された警告メッセージであなたが望むものを何でもするためにそれを使うことができます。 (このトピックの優れた短い紹介として、this SO questionの回答を参照してください。

ここでは、次のようなハンドラを定義します。(a)警告メッセージをファイルに追加します。 (b)invokeRestart()を使用して、警告がスローされた場所での機能の評価を続けます。あなたは明らかにあなたの正確なニーズに合わせて、これを変更することができます。

# DEFINE A WRAPPER FUNCTION THAT: 
# - EVALUATES A GIVEN EXPRESSION 
# - SAVES ALL WARNINGS TO A LOGFILE 
saveAllWarnings <- function(expr, logFile="warning_log.R") { 
    withCallingHandlers(expr, 
     warning=function(w) { 
      cat(conditionMessage(w), "\n\n", file=logFile, append=TRUE) 
      invokeRestart("muffleWarning") 
     }) 
} 

# TRY IT OUT WITH A MADE UP FUNCTION THAT THROWS SEVERAL WARNINGS 
messyFun <- function() { 
    warning("oops") 
    warning("boops") 
    warning("can't I get anything right?") 
    1 
} 

saveAllWarnings(messyFun(), logFile="messyFun warning log.R") 
関連する問題