1. ホーム
  2. r

[解決済み] Rでのデバッグのための一般的な提案

2022-08-07 15:18:08

質問

自分が書いたRの関数を使うとエラーが発生します。

Warning messages:
1: glm.fit: algorithm did not converge 
2: glm.fit: algorithm did not converge 

私がしてきたこと

  1. 関数をステップ実行する
  2. エラーが発生した行を見つけるためにprintを追加すると、2つの関数が使われるべきではないことを示唆しています。 glm.fit . それらは window()save() .

私の一般的なアプローチとしては printstop コマンドを使用し、例外を見つけることができるまで関数を一行ずつ見ていきます。

しかし、これらのテクニックを使用しても、このエラーがコードのどこに由来しているのか、私には明らかではありません。コード内のどの関数が glm.fit . この問題を診断するにはどうしたらよいでしょうか。

どのように解決するのですか?

デバッグは芸術の一形態であり、明確な特効薬はないと言っていいでしょう。 どんな言語にもデバッグのための良い戦略があり、それはここでも適用されます (例. この素晴らしい記事を読む ). 例えば、最初にすることは 問題を再現する ...それができない場合は、より多くの情報を得る必要があります (たとえば、ログを取るなど)。 再現できたら、次のことが必要です。 を減らす をソースに還元する必要があります。

トリックというよりは、お気に入りのデバッグルーチンがあるといったほうがいいかもしれません。

  1. エラーが発生したとき、私が通常行う最初のことは、スタック トレースを見るために traceback() を呼び出してスタックトレースを見ます。これはエラーが発生した場所を示してくれるので、いくつかのネストした関数がある場合に特に便利です。
  2. 次に、私は options(error=recover) これはすぐにエラーが発生したブラウザモードに切り替わるので、そこからワークスペースをブラウズすることができます。
  3. それでもまだ十分な情報がない場合、私は通常 debug() 関数を使用して、スクリプトを一行ずつ見ていきます。

R 2.10での最高の新しいトリックは、(スクリプトファイルを扱うときに) findLineNum()setBreakpoint() という関数があります。

最後のコメントとして、エラーに応じて try() または tryCatch() ステートメントを外部関数呼び出しの周りに追加します(特にS4クラスを扱う場合)。 これは、時にはさらに多くの情報を提供し、また、実行時にエラーがどのように処理されるかをよりコントロールできるようになります。

これらの関連する質問には、多くの提案があります。