2012-10-29 29 views
22

私が理解していない対話型と非対話型のRセッションの違いは、traceback()です。以下のコードではエラーが発生しますが、インタラクティブなRセッションではトレースバック情報が表示されますが、コードをtest.Rに保存してRscript test.RまたはR -f test.Rでコールすると、トレースバックは表示されなくなります。対話型と非対話型のRセッションのトレースバック()

対話型のRセッションで
f = function() { 
    on.exit(traceback()) 
    1 + 'a' 
} 
f() 

> f = function() { 
+ on.exit(traceback()) 
+ 1 + 'a' 
+ } 
> f() 
Error in 1 + "a" : non-numeric argument to binary operator 
1: f() 

非対話型実行:

$ Rscript test.R 
Error in 1 + "a" : non-numeric argument to binary operator 
Calls: f 
No traceback available 
Execution halted 

I ?tracebackに説明がありませんでした。非対話型のRセッションでトレースバックを有効にする方法があるのだろうかと思います。ありがとう!

+0

'オブジェクトを探しますtraceback' baseenv()で '.Traceback'と呼ばれています。これは 'src/main/errors.c'のように見えますが、他の条件の中でも' R_Interactive || haveHandler'。 '.Traceback'がなければ、" No traceback available "というメッセージが表示されます。また '?Traceback'には' .Traceback'という警告があります。 – BenBarnes

+0

スクリプトでオプション(error = traceback)を設定してon.exit呼び出しを削除しただけで、目的の効果が得られます。エラーの「ステップ」のために複製が作成されますが。 –

+0

@BrandonBertelsen、私が知る限り、非対話型セッションでエラーが発生した場合でも呼び出しスタックは返されますが、トレースバック情報にはアクセスできません。 – BenBarnes

答えて

20

引数のデフォルト値を使用すると、traceback()は、内の.Tracebackという名前のオブジェクトを呼び出しスタックについて調べます。 .Tracebackのように見える(src/main/errors.cから)のは、他の条件の中でも、非対話型セッション中にこのオブジェクトが作成されていないことを示唆した場合にのみ作成されます。 .Tracebackという名前のオブジェクトがない場合、 "No traceback available"というメッセージが表示されます。

traceback()x引数にNULL以外の値を渡すことで、非対話型セッションからコールスタックに関する情報を取得できます。スタック内をスキップする呼び出し数を示す0以外の整数値を指定すると、ではなくcレベルの関数(R_GetTraceback)がコールスタックを調べるために呼び出されます。

だから、非対話型セッションでトレースバック情報を取得するカップルの方法があります:

f = function() { 
    on.exit(traceback(1)) 
    1 + 'a' 
} 
f() 

あるいは、ブランドンBertelsenは

options(error=function()traceback(2)) 

xに渡された異なる値を示唆したようoptionsを設定2つの例は、スキップする関数の数が異なることを説明しています。

  1. on.exitの例では、traceback(1)traceback()への呼び出しをスキップします。

  2. 例設定optionsには、スキップする必要があります/ traceback()を呼び出す余分な匿名関数があります。 OPの例で

、非対話型セッションでエラーが発生した場合に備えた自動トレースバックと比較traceback()を用いて得られるより多くの情報がありません。しかし、引数を取る(渡される)関数では、非対話型セッションでの呼び出しスタックの標準的な表示よりも、traceback()を使用する方がはるかに有益です。

+0

ありがとう!私はxに数値を設定することは、非対話型のRセッションでも機能することに気付かなかった。 –

+4

'options(error = function()traceback(2))'を使うと、エラーが発生してもスクリプトが正常に終了することに注意してください!解決策は 'error = function(){traceback(2);}を使うことです。ここで使用されている停止引数は、[デフォルトのエラー動作](https://stat.ethz.ch/R)からのものです。 -manual/R-devel/library/base/html/stop.html))。 – dshepherd

2

デバッグ情報をダンプして後で読み込む可能性もあります。(トピックに関する良い?debuggerヘルプページやコメントを参照してください)

経由例:

options(error = quote(dump.frames("testdump", TRUE))) 

...

load("testdump.rda") 
debugger(testdump) 

または

options(error = quote({dump.frames(to.file = TRUE); q(status = 1)}))