長さの合わないベクトル同士の演算は警告付きで再利用(リサイクル)される
長さの異なるベクトル同士を+などで演算すると、短い方のベクトルが先頭から繰り返し使われて長さを揃えます。長い方が短い方の倍数でない場合は警告が出ますが、それでも計算自体は止まらず結果が返ります。
なぜエラーが出ないのか
出力: 90 180 290
(エラーなし)- Rは何も報告しません。文法としても実行としても正しいコードだからです
90 180 290- 実際の出力 — 期待した結果と食い違っている箇所
このエラーが出る典型パターン
パターン1
1 prices <- c(100, 200, 300) 2 discounts <- c(10, 20 ) ^ 3 total <- prices - discounts 4 cat(total, "\n")
discountsが長さ2のままだと、足りない3番目の要素は警告付きで先頭から使い回されます。長さを揃えると正しい値になります。
直し方: (空) を , 30 にします。
パターン2
1 weights <- c(5, 10, 15, 20, 25) 2 adj <- c(1, 2 ) ^ 3 result <- weights + adj 4 cat(result, "\n")
adjの長さがweightsの長さの約数でないと、リサイクルの継ぎ目がずれて意図しない値が混ざります。
直し方: (空) を , 3, 4, 5 にします。
パターン3
1 scores <- c(70, 80, 90) 2 bonus <- c(5, 10 ) ^ 3 result <- scores + bonus 4 cat(result, "\n")
bonusが2要素しかないと、3番目のscoreには1番目のbonusが再利用され、意図した15ではなく5が足されます。
直し方: (空) を , 15 にします。
パターン4
1 a <- c(2, 4, 6, 8, 10) 2 b <- c(1, 2, 3 ) ^ 3 result <- a * b 4 cat(result, "\n")
bが3要素のままだと、長さ5のaに対して先頭から再利用され、4番目・5番目の値が意図とずれます。
直し方: (空) を , 4, 5 にします。
パターン5
1 temps <- c(10, 20, 30) 2 delta <- c(1, -1 ) ^ 3 result <- temps + delta 4 cat(result, "\n")
deltaが2要素だと3番目のtempには1番目のdeltaが再利用され、意図した3番目の増減値が反映されません。
直し方: (空) を , 2 にします。
よくある誤解
「長さが違えばエラーになって止まるはず」という思い込みは誤りです。Rは警告を出すことはあっても、多くの場合は黙って短い方を使い回して計算を続けてしまいます。
実務での勘所
警告が出るかどうかは、長い方の長さが短い方の長さのちょうど倍数になっているかどうかで決まります。長さ6のベクトルと長さ2のベクトルなら、2が6にきれいに3回収まるため警告は一切出ません。長さ5と長さ2の組み合わせは、2が5に割り切れずに中途半端に使い回されるため、警告が出ます。警告が無いからといって長さが同じとは限らず、単に「きれいな倍数関係」だったというだけなので、意図せぬリサイクルはこの条件でも起こりえます。