リストの [[ ]] で範囲外アクセスすると subscript out of bounds になる
リストに対して[[ ]]で存在しない添字を指定すると、subscript out of boundsというエラーになります。ベクトルの[ ]と違い、[[ ]]は範囲外を静かに見逃しません。
エラーメッセージの読み方
Error in lst[[5]] : subscript out of bounds
Error- エラー種別 — 実行中に発生しました
lst[[5]]- 発生箇所 — エラーの原因になった呼び出し
subscript out of bounds- 詳細メッセージ — 何が問題だったか
このエラーが出る典型パターン
パターン1
1 lst <- list(1, 2, 3) 2 print(lst[[5 ]]) ^
Error in lst[[5]] : subscript out of bounds
リストの要素数は3個なのに5番目を[[ ]]で取り出そうとしています。[[ ]]は範囲外を静かに見逃さずエラーにします。
直し方: 5 を 2 にします。
広告
広告スロット(未設定)
パターン2
1 items <- list("a", "b") 2 print(items[[9]]) ^
Error in items[[9]] : subscript out of bounds
要素数を超えた添字を[[ ]]で指定すると、ベクトルの[ ]と違い、エラーで止まります。
直し方: 9 を 1 にします。
パターン3
1 data <- list(10, 20, 30, 40) 2 print(data[[10]]) ^
Error in data[[10]] : subscript out of bounds
添字が範囲内かどうかは、length()で要素数を確認してから使う必要があります。
直し方: 10 を 4 にします。
パターン4
1 colors <- list("red", "blue", "green") 2 print(colors[[7]]) ^
Error in colors[[7]] : subscript out of bounds
リストの[[ ]]は単一の要素を厳密に取り出す演算子で、範囲外を指定すると例外になります。
直し方: 7 を 3 にします。
パターン5
1 nums <- list(1, 2, 3, 4, 5) 2 print(nums[[100]]) ^
Error in nums[[100]] : subscript out of bounds
他言語で範囲外アクセスが即エラーになる感覚は正しいですが、Rでは[ ]と[[ ]]で挙動が違う点に注意してください。
直し方: 100 を 5 にします。
よくある誤解
「[ ]と[[ ]]はどちらも同じように範囲外でNAを返すはず」という思い込みは誤りです。リストの[[ ]]は単一の要素を厳密に取り出す演算子で、範囲外を指定するとエラーになります。
実務での勘所
[[と[の厳格さの違いは、それぞれが表している操作の性質の違いに由来します。[[は「ここにある、ただ1つの要素を取り出す」という一意な抽出を意図した演算子で、要求どおりに1つの要素が存在しなければ、それは前提が崩れているという明確なエラーです。[は「条件に合う部分集合を取り出す」という、0個でも複数でも結果になりうる操作を意図しているため、該当が無ければ空の結果を返すという、より柔軟な設計になっています。