中級のRエラー 55問
11種類のエラーを、それぞれ複数パターンずつ収録しています。
- 長さの合わないベクトル同士の演算は警告付きで再利用(リサイクル)される長さの異なるベクトル同士を+などで演算すると、短い方のベクトルが先頭から繰り返し使われて長さを揃えます。長い方が短い方の倍数でない場合は警告が出ますが、それでも計算自体は止まらず結果が返ります。
- 関数内の <- による代入はグローバル変数を変更しない関数の中で<-を使って外側と同じ名前の変数に代入しても、それは関数内だけのローカル変数を新しく作るだけで、外側のグローバル変数には影響しません。外側の変数を書き換えたい場合は<<-を使う必要があります。
- sapply は結果を勝手に行列へ簡略化することがあるsapplyは各要素の計算結果が同じ長さのベクトルであれば、リストではなく行列に自動的にまとめてしまいます。1個の値だけを期待していたコードが、複数要素を返す関数を渡した途端に行列を受け取ることになります。
- == で NA と比較すると NA が返り FALSE にはならないNAを含む式を==で比較すると、結果はTRUEでもFALSEでもなくNAになります。「等しくない」ことを確認したいつもりでNAと比較しても、判定自体ができません。
- リストの [ ] は要素そのものではなく部分リストを返す([[ ]] との違い)リストに対して[ ]でアクセスすると、中身の値そのものではなく、その要素だけを含む部分リストが返ります。中身の値を直接取り出したい場合は[[ ]]を使う必要があります。
- non-conformable arguments の原因と直し方(行列の次元不一致)行列の掛け算%*%は、左の行列の列数と右の行列の行数が一致していないと計算できません。次元が合わないとnon-conformable argumentsというエラーになります。
- 1:length(x) は x が空ベクトルのとき 1 と 0 の2回ループしてしまう1:length(x)はxが空ベクトル(長さ0)のとき1:0、つまりc(1, 0)という降順の数列になります。空のはずのループが2回実行され、存在しない添字xでのアクセスが発生します。
- 引数名の部分マッチにより意図しない引数に値が渡ることがあるRの名前付き引数は、他の引数名と衝突しない範囲で省略して書けます(部分マッチ)。似た名前の引数が複数ある関数で省略して書くと、意図と違う引数に値が渡ってしまうことがあります。
- 順序なし factor を < や > で比較すると警告付きで NA になるfactor型の値は、順序を持たない通常のfactorのままだと< や >のような大小比較ができず、'not meaningful for factors'という警告とともにNAになります。大小関係のある比較をしたい場合は、factor()の時点でordered = TRUEを指定しておく必要があります。
- sapply に渡す関数へ追加引数を渡し忘れると missing エラーになるsapply(x, f, ...)の...部分に追加引数を渡し忘れると、fの2つ目以降の必須引数が埋まらず、argument is missingエラーになります。
- which() の戻り値と論理ベクトルによる添字指定を混同するとずれるwhich(条件)は条件を満たす要素の「位置(添字番号)」を返しますが、条件そのもの(論理ベクトル)を直接添字として使うのとは意味が違います。which()の結果をさらに論理ベクトルとして使うと、位置の数値がTRUE/FALSEとして解釈され、意図と違う要素が選ばれます。