32

対話型と非対話型の R セッションの違いを観察しましたが、traceback()それについては理解できません。以下のコードではエラーが発生しますが、インタラクティブな R セッションではトレースバック情報を確認できますが、コードを に保存してまたはtest.R経由で呼び出すと、トレースバックは表示されなくなります。Rscript test.RR -f test.R

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

インタラクティブな R セッションで:

> 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

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

4

4 に答える 4

32

引数のデフォルト値を使用して、コール スタックに関する情報を得るために で指定されtraceback()たオブジェクトを探します。(から) のように見えますが、他の条件の中で、このオブジェクトが非対話型セッション中に作成されないことを示唆している場合にのみ作成されます。という名前のオブジェクトがない場合は、「トレースバックがありません」というメッセージが表示されます。.Tracebackbaseenv()src/main/errors.c.TracebackR_Interactive || haveHandler.Traceback

ただし、NULL 以外の値を のx引数に渡すtraceback()ことにより、非対話型セッションからコール スタックに関する情報を取得できます。0 以外の整数値 (スタックでスキップする呼び出しの数を示す) を使用すると、C レベル関数 ( R_GetTraceback) が呼び出され、 を参照する代わりに呼び出しスタックが調査され.Tracebackます。

したがって、非対話型セッションでトレースバック情報を取得するには、次の 2 つの方法があります。

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

または、optionsBrandon Bertelsenが提案したように設定します

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

2 つの例で渡される値がx異なるため、スキップする関数の数が異なります。

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

  2. 設定例では、スキップする必要がある/スキップできるoptions呼び出しを行う追加の無名関数があります。traceback()

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

于 2012-10-29T09:58:37.857 に答える
0

問題options(error=function()traceback(2))は、スクリプトの実行を停止しないことです。これは非常に危険です。

それを回避するには、次を使用できます。

options(error = function() { 
  traceback(2); 
  options(error = NULL); 
  stop("exiting after script error") 
})

これにより、スタック トレースが適切に出力され、適切に終了します。

于 2021-09-17T08:28:56.697 に答える