「大人の教養・知識・気付き」を伸ばすブログ

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。データ分析・語学に力点を置いています。 →現在、コンサルタントの雛になるべく、少しずつ勉強中です(※2024年1月21日改訂)。

MENU

プログラムとしてのRを学ぶ(その13/16)

 \mathrm{R}をプログラムとして見たときに注意・検討すべきところを学んでおきたい、ということで

を読んでいく。

13. デバッグ

13.1 デバッグの基本原則

 デバッグは科学というテクニックであるが、基本的な原則が存在する。

13.1.1 デバッグの神髄:確認の原則

 デバッグにおいて確認の原則が真髄である。

 バグのあるプログラムの修正は、コードに関して正しいと「思っている」さまざまな事項が「実際に」正しいことを1つずつ確認する作業です。思い込みの1つが正しく「ない」とわかったら、バグの(正確な本質とまではいかなくても)位置の手掛かりが見つかります。

13.1.2 小さく始める

 デバッグ工程の初期には、小さく簡単なテストケースに専念すること。

13.1.3 モジュール式のトップダウンでのデバッグ

 コードはモジュール式にすべきである。第一水準のコードは数十行を超えるべきではなく、そのほとんどを関数呼び出しにすべきである。また関数は長すぎないようにし、必要に応じて他の関数を呼び出すこと。
 デバッグトップダウンで行うべきである。デバッグ先が他の関数を呼び出している際、まずは当初のデバッグ先に問題がない事を確認してから、その参照関数を呼び出す。

13.1.4 アンチデバッグ

 何らかのアンチデバッグ戦略も適用できる。たとえば変数\mathrm{x}が正になるべきコード部分があるとき、以下の行を挿入する。

stopifnot(x > 0)

 バグを修正して新しいコードをテストした後でも、このコードはそのままにし、後にこのバグが別所で再度出現していないかを調べると良い。

13.2 デバッグツールを使うべき理由

 手作業によるデバッグ作業は、長いセッションではとても退屈で、また編集作業で気が散り、肝心のバグ発見に集中でき無くなり得る。そのためデバッグツールを用いた方が良い。

13.3 Rのデバッグ機能

 \mathrm{R}デバッグ機能の中心はブラウザである。ブラウザは\mathrm{debug}()関数か\mathrm{browser}()関数を呼び出すと起動できる。
 関数\mathrm{f}()にバグがあると考えている場合、\mathrm{debug(f)}を呼び出して関数\mathrm{f}()デバッグ状態に設定できる。\mathrm{undebug(f)}を呼び出すとデバッグ状態を解除できる。
 一方で\mathrm{f}()の任意の位置に\mathrm{browser}()の呼び出しを配置すると、実行がその行に到達したときのみにブラウザを起動する。

13.3.1 ブラウザコマンドの利用

 ブラウザでは、以下のコマンドを利用できる:

  • \mathrm{n(next)}:次の行を実行し、再び一時停止するように指示する。
  • \mathrm{c(continue)}:複数行のコードを実行してから一時停止できる。
  • 任意の\mathrm{R}コマンド
  • \mathrm{where}スタックトレースを出力する。
  • \mathrm{Q}:ブラウザを終了する。
13.3.2 ブレークポイントの設定

 バグのあり得る箇所をピンポイントで指定したければ、ブレークポイントを設定すればよい。\mathrm{R}ブレークポイントは、\mathrm{browser}を直接呼び出すか、\mathrm{setBreakpoint}()を用いればよい。

13.4 整合性の確保

 乱数を使う際は、\mathrm{set.seed}()を用いて制御する。

13.5 構文エラーと実行時エラー

 最も一般的な構文エラーは、丸括弧、角括弧、中括弧ないし引用符の対応が取れていないことである。もし構文エラーに気付いた場合、まずはこれらが生じていないかをチェックする。
 構文エラーの場所が明白ではない場合、構文問題の位置を特定しやすくなるため、コードを選んでコメントアウトすることを推奨する。

 \mathrm{warnings}メッセージが生じた場合は、\mathrm{warnings}()を用いて確認する。

プライバシーポリシー お問い合わせ