16

時々Rは私に次のようなエラーをスローします

if (ncol(x) != 2) { : 引数の長さがゼロのエラー

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

ほとんどのパッケージは圧縮されているため、 grep は簡単ではありません/usr/lib/R/library

4

2 に答える 2

21

を使用traceback()して、最後にエラーが発生した場所を特定できます。通常、関数で行う呼び出しを示します。次に、通常browser()、その時点で関数を再度実行し、何が問題なのかを確認します。

たとえば、次の 2 つの関数があります。

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

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

f2()length の引数を想定していることに注意してください1。私たちは誤用することができます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。かなりクリアな。入力を確認するために、呼び出しの直前に配置fして再割り当てできます。関数の実行を停止し、その環境を見回すだけです。と似ていますが、問題が発生したことがわかるまですべての行を実行する必要はありません。browserf2browser()debugdebugonce

于 2012-11-19T14:39:59.680 に答える
18

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

于 2012-11-19T14:51:09.367 に答える