長さ(要素数)が同じベクトル

長さが同じベクトル同士の計算では、添字などを指定することなく、要素ごとに順番に計算を行い、計算結果のベクトルを返します。

> a <- 1:3
> b <- 2:4
> a * b
[1]  2  6 12

以下は、計算のイメージです。

a[1] * b[1] ⇒ 1 - 2 ⇒  2
a[2] * b[2] ⇒ 2 - 3 ⇒  6
a[3] * b[3] ⇒ 3 - 4 ⇒ 12

複数の要素を持つベクトルと要素(長さ1のベクトル)

> 1:5 * 2
[1]  2  4  6  8 10
> a <- 1:3
> a
[1] 1 2 3 4 5
> a + 3
[1] 4 5 6
> b <- 4
> a - b
[1] -3 -2 -1

以下は、計算のイメージです。

a[1] - b[1] ⇒ 1 - 4 ⇒ -3
a[2] - b[1] ⇒ 2 - 4 ⇒ -2
a[3] - b[1] ⇒ 3 - 4 ⇒ -1

長さが異なるベクトル

長さ6のベクトル(a)に対して、長さが1, 2, 3, 4のベクトル(b)とで計算してみます。

長さa:b = 6:1の場合は、b[1]が6回繰り返されます。上の複数の要素を持つベクトルと要素(要素が1つのベクトル)と同じです。

> a <- 1:6
> b <- 1
> a + b
[1] 2 3 4 5 6 7

長さa:b = 6:2の場合は、b[1], b[2]が3回繰り返されます。

> a <- 1:6
> b <- 1:2
> a - b
[1] 0 0 2 2 4 4
a[1] - b[1] ⇒ 1 - 1 ⇒ 0
a[2] - b[2] ⇒ 2 - 2 ⇒ 0
a[3] - b[1] ⇒ 3 - 1 ⇒ 2
a[4] - b[2] ⇒ 4 - 2 ⇒ 2
a[5] - b[1] ⇒ 5 - 1 ⇒ 4
a[6] - b[2] ⇒ 6 - 2 ⇒ 4

長さa:b = 6:3の場合は、b[1], b[2], b[3]が2回繰り返されます。

> a <- 1:6
> b <- 1:3
> a * b
[1]  1  4  9  4 10 18
a[1] * b[1] ⇒ 1 * 1 ⇒  1
a[2] * b[2] ⇒ 2 * 2 ⇒  4
a[3] * b[3] ⇒ 3 * 3 ⇒  9
a[4] * b[1] ⇒ 4 * 1 ⇒  4
a[5] * b[2] ⇒ 5 * 2 ⇒ 10
a[6] * b[3] ⇒ 6 * 3 ⇒ 18

長さa:b = 6:4の場合は、計算はされましたが、警告メッセージが出力されました。

> a <- 1:6
> b <- 1:4
> a / b
[1] 1 1 1 1 5 3
 警告メッセージ:
 a/b で:
   長いオブジェクトの長さが短いオブジェクトの長さの倍数になっていません
a[1] / b[1] ⇒ 1 / 1 ⇒ 1
a[2] / b[2] ⇒ 2 / 2 ⇒ 1
a[3] / b[3] ⇒ 3 / 3 ⇒ 1
a[4] / b[4] ⇒ 4 / 4 ⇒ 1
a[5] / b[1] ⇒ 5 / 1 ⇒ 5
a[6] / b[2] ⇒ 6 / 2 ⇒ 3

計算の繰り返し

ベクトル同士の計算では、短い方のベクトルが繰り返されて、計算されます。長い方のベクトルの長さが、短い方の長さの倍数になっていれば、繰り返されて、問題なく計算されます。長さ1でもベクトルですので、長い方の長さの回数だけ計算が繰り返され、長さが同じであれば、どちらか長いのかわかりませんが、1倍で繰り返し回数1と考えられます。

ソースを知らないので、実際はわかりませんが、この仕組みで、データをひとまとめに塊のまま計算できるようになっていることが想像できます。ただ、それにより問題が起きる可能性もあります。

長さ1や、同じ長さでの計算だけなら、余分なことを考えなくてもよいのですが、ベクトルの長さが異なる場合には注意が必要です。特定の要素だけを計算したい場合でも、ベクトルの長さに問題がなければ、繰り返されて計算されてしまうからです。警告メッセージが表示されれば気づきますが、警告もなく計算されてしまい、思わぬ結果になることもあるので、気をつけましょう。