2012-11-19 15 views
12

時にはRはスロー私のエラーのようなRエラーが発生した場所を見つける方法は?

場合にエラーで(NcoI部位(X)= 2!){:引数は長さであるゼロ

を私が書いた追加情報なし、とそのようなコードはありません。どのパッケージのどの機能がエラーを引き起こすかを見つける一般的な方法はありますか?

ほとんどのパッケージは圧縮されているので、grep /usr/lib/R/libraryには些細なことではありません。

+0

デバッグする最も簡単な方法は、行単位でコードをステップ実行することです。あなたが書いた関数からエラーが発生した場合は、 'debugonce(function_name)'を使ってエラーをデバッグすることができます。これは、関数の範囲内にミニRセッションを提供します。 – Justin

+0

これは私がやっていることですが、私は何かに時間を費やして自動化できるように感じています。 – Tim

答えて

17

traceback()を使用して、最後にエラーが発生した場所を特定できます。通常、それはあなたがあなたの機能で行う呼び出しを指し示します。その後、私は通常、その時点でbrowser()と入力し、関数を再度実行して何がうまくいかないかを確認します。例えば

、ここでは2つの機能である:f2()が長1の引数をとること

f2 <- function(x) 
{ 
    if (x==1) "foo" 
} 

f <- function(x) 
{ 
    f2(x) 
} 

注意。私たちは、fを誤用することができます

> f(NULL) 
Error in if (x == 1) "foo" : argument is of length zero 

今、私たちは何が悪かったのか見つけるためにtraceback()を使用することができます。

> traceback() 
2: f2(x) at #3 
1: f(NULL) 

数は、我々は、ネストされた関数であるか深い意味します。そこで、ff2と表示され、3というエラーが表示されます。かなりクリアな。 f2今すぐ電話する前にfbrowserに再割り当てして、入力を確認することができます。 browser()は、単に関数の実行を停止し、その環境を見回すことができます。 debugおよびdebugonceに似ていますが、何か問題があることが分かるまで、すべての行を実行する必要はありません。

+0

Nitpick:引数が長さ> 0であると仮定すると 'f2'ではなく、' if'文です。 – naught101

16

@SachaEpskampが既に提案しているものに追加するだけで、よく知られていないコードをデバッグするときにoptions(error=recover)options(show.error.locations=TRUE)を設定することは非常に役立ちます。 1つ目は、Rがエラー時にデバッグセッションを開始するようにするため、そのエラーまで呼び出しスタック内の任意のポイントでブラウザを呼び出すオプションが与えられます。 2番目のオプションは、Rにエラーにソース行番号を含めるよう指示します。

+2

さらに、 'options(warn = 2)'を設定すると、警告が発生しても同じことが起こります。数字が間違って変換された場合(「NA」を誘導します。 – richiemorrisroe

+0

オプションを(error = recover)、オプション(show.error.locations = TRUE)、オプション(warn = 2)に設定していますが、これらのオプションを元の状態にリセットしたいのですが、どうすればいいですか? – stochasticcrap

+1

'o < - options(error = recover、show.error.locations = TRUE、warn = 2);#do stuff; do.call(options、o)#reset'この回答があなたに役立つならば、自由にupvoteすることができます。 –

関連する問題