Code Fix

初級

リストの [[ ]] で範囲外アクセスすると 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個でも複数でも結果になりうる操作を意図しているため、該当が無ければ空の結果を返すという、より柔軟な設計になっています。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)