上級のRエラー 40問
8種類のエラーを、それぞれ複数パターンずつ収録しています。
- S3の print メソッドで NextMethod() を省略すると基底クラスの表示が失われるS3クラスに独自のprint.myclassを定義するとき、NextMethod()を呼ばずに独自の出力だけを書くと、継承元のクラスが本来表示していた情報が完全に失われます。
- environment はベクトルと違い参照渡しのように振る舞うRのベクトルやリストは関数に渡すと複製され、関数内での変更は呼び出し元に影響しません。一方environmentは参照として渡されるため、関数内でその中身を書き換えると呼び出し元のenvironmentにもその変更が反映されます。
- 関数名を直接書いた再帰呼び出しは、関数を別名に代入し直すと壊れる再帰関数の中で自分自身を関数名で直接呼び出していると、その関数を別の変数名に代入し直して元の名前を消した途端、再帰呼び出しの箇所がobject not foundエラーになります。名前に依存せず自分自身を参照したい場合はRecall()を使う必要があります。
- do.call に渡すリストの名前が引数名と一致しないと unused argument になるdo.call(f, args)は、argsという名前付きリストの各要素名をfの引数名として渡します。リストの要素名が関数の引数名と1文字でも違うと、その引数は認識されず「使われない引数」としてエラーになります。
- match.arg に候補外の値を渡すと 'arg' should be one of エラーになるmatch.arg()で選択肢を制限した引数に、定義された候補のどれとも一致しない値を渡すと、'arg' should be one ofというエラーになります。
- Reduce に init を渡さず空ベクトルを渡すと NULL が返り後続処理でエラーになるReduce(f, x)はinitを省略した状態でxが空ベクトルだと、畳み込みを始める最初の値が無いためエラーにはならずNULLを返します。そのNULLをif()の条件などにそのまま使うと、そこで初めて「argument is of length zero」というエラーになります。
- vapply は FUN.VALUE のひな形と実際の戻り値の型・長さが違うとエラーになるvapplyはFUN.VALUEに渡したひな形と、実際に関数が返す値の型や長さが厳密に一致しないとエラーになります。sapplyのように結果の形を黙って合わせてはくれません。
- tryCatch の error ハンドラは warning を捕まえないtryCatch(expr, error = function(e) ...)のerrorハンドラは、条件クラスがerrorであるものしか捕まえません。warning()で発生させた警告は、実行が止まらないままerrorハンドラをすり抜けます。