時にはRはスロー私のエラーのようなRエラーが発生した場所を見つける方法は?
場合にエラーで(NcoI部位(X)= 2!){:引数は長さであるゼロ
を私が書いた追加情報なし、とそのようなコードはありません。どのパッケージのどの機能がエラーを引き起こすかを見つける一般的な方法はありますか?
ほとんどのパッケージは圧縮されているので、grep /usr/lib/R/library
には些細なことではありません。
時にはRはスロー私のエラーのようなRエラーが発生した場所を見つける方法は?
場合にエラーで(NcoI部位(X)= 2!){:引数は長さであるゼロ
を私が書いた追加情報なし、とそのようなコードはありません。どのパッケージのどの機能がエラーを引き起こすかを見つける一般的な方法はありますか?
ほとんどのパッケージは圧縮されているので、grep /usr/lib/R/library
には些細なことではありません。
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)
数は、我々は、ネストされた関数であるか深い意味します。そこで、f
はf2
と表示され、3
というエラーが表示されます。かなりクリアな。 f2
今すぐ電話する前にf
をbrowser
に再割り当てして、入力を確認することができます。 browser()
は、単に関数の実行を停止し、その環境を見回すことができます。 debug
およびdebugonce
に似ていますが、何か問題があることが分かるまで、すべての行を実行する必要はありません。
Nitpick:引数が長さ> 0であると仮定すると 'f2'ではなく、' if'文です。 – naught101
@SachaEpskampが既に提案しているものに追加するだけで、よく知られていないコードをデバッグするときにoptions(error=recover)
とoptions(show.error.locations=TRUE)
を設定することは非常に役立ちます。 1つ目は、Rがエラー時にデバッグセッションを開始するようにするため、そのエラーまで呼び出しスタック内の任意のポイントでブラウザを呼び出すオプションが与えられます。 2番目のオプションは、Rにエラーにソース行番号を含めるよう指示します。
さらに、 'options(warn = 2)'を設定すると、警告が発生しても同じことが起こります。数字が間違って変換された場合(「NA」を誘導します。 – richiemorrisroe
オプションを(error = recover)、オプション(show.error.locations = TRUE)、オプション(warn = 2)に設定していますが、これらのオプションを元の状態にリセットしたいのですが、どうすればいいですか? – stochasticcrap
'o < - options(error = recover、show.error.locations = TRUE、warn = 2);#do stuff; do.call(options、o)#reset'この回答があなたに役立つならば、自由にupvoteすることができます。 –
デバッグする最も簡単な方法は、行単位でコードをステップ実行することです。あなたが書いた関数からエラーが発生した場合は、 'debugonce(function_name)'を使ってエラーをデバッグすることができます。これは、関数の範囲内にミニRセッションを提供します。 – Justin
これは私がやっていることですが、私は何かに時間を費やして自動化できるように感じています。 – Tim