7

を使用して R デバッガーにドロップした場合、ドロップされたoptions(error=recover)場所の周りのコードを確認するにはどうすればよいですか? 例えば:

options(error=recover)
solve(matrix(0, nrow=5, ncol=5))

# Error in solve.default(matrix(0, nrow = 5, ncol = 5)) : 
#   Lapack routine dgesv: system is exactly singular: U[1,1] = 0
# 
# Enter a frame number, or 0 to exit   
# 
# 1: solve(matrix(0, nrow = 5, ncol = 5))
# 2: solve.default(matrix(0, nrow = 5, ncol = 5))
# 
# Selection: 1
# Called from: top level 
Browse[1]> 

この時点でnまたはreturnを押すと、コード行がまったく表示されずに、再び終了してrecoverプロンプトが表示されます。スタック トレース (type where) を実行すると、呼び出しチェーンは表示されますが、実際に座っているコード (スタックのどのレベルでも) は表示されません。 [実際、この場合、コードが少し見えますがsolve、それは、1 つの無名関数がスタックの一部であるため、その名前ではなくその定義を出力する以外に選択肢がないためです。]

任意のヒント?

[編集] 誰かのパッケージ コードで何が起こっているのかを把握する必要があるユース ケースに (特に) 興味があります。私はソースを管理していないので、 を追加できませんbrowser()。また、ソース ファイルに簡単にアクセスできないため、行番号だけではあまり役に立ちません。私は主に実際のコードを見たいだけです。

4

2 に答える 2

5

も設定options(show.error.locations=TRUE)すると、R はソース行番号をエラーとともに出力します。

Error in eval(expr, envir, enclos) (from test.R#4) :

test.R#4 は、4 行目でエラーが発生したことを示します。

ブレークポイントを挿入するためだけに を使用している場合はbrowser、 で識別テキストを指定しbrowser(text='end of plotting function')、 でブラウジング セッション中にこのテキストを取得して、現在のbrowserText()場所を確認することができます。

編集

インストールされた関数を使用しているときに発生したエラーの場所を見つけたい場合、標準的な方法はdebug、関数を呼び出し、コードを実行してから、エラーが発生するまでステップスルーすることです。詳細については、を参照?debugしてください。

ただし、せっかちなタイプの場合は、次のトリックを使用して、が にshow.error.locations設定されているときにエラーが発生した、インストールされた関数の本体の行番号を取得できますTRUE

s<-paste(c(capture.output(dump('solve.default', file='')), 
          'solve(matrix(0, nrow=5, ncol=5))'), 
         collapse='\n')
source(textConnection(s))

これは、(提供した例のマトリックスで呼び出されるメソッド)sの定義と、エラーを発生させる呼び出しで構成される文字列です。solve.default

于 2013-01-30T15:55:04.920 に答える
2

Emacs が好きなら、ess-tracebug パッケージがソース コード バッファーの現在の行にカーソルを移動することでこの機能を提供することを理解しています。ess-tracebug は、ESS モードの最新バージョンに含まれています。

(OPがEmacsを気に入らない場合は、私の答えに投票しないでください。より良いものを待ってください。)

于 2013-01-30T17:19:31.913 に答える