[R] vector要素へのアクセス

2018年3月19日月曜日

R

CやJavaに慣れたプログラマーがRを使おうとすると、配列の扱いという基本的なところで、いきなり戸惑ってしまうことがある。

array? vector?

まず異なるのはarrayというのが、CやJavaのいわゆる配列とは別のデータ構造を意味しているということ。
https://cran.r-project.org/doc/manuals/r-release/R-lang.html#Attributes

CやJavaの配列に相当するのはvectorになる。
https://cran.r-project.org/doc/manuals/r-release/R-lang.html#Vector-objects

というか、Rの最も基本的なデータ構造がvectorで、逆にRにはスカラーはない。
x <- "A"
とかやっても、要素数が1のvectorになる。
length(x)
 [1] 1
x[1]
 [1] "A"

1ベース

次に異なるのはインデックスの先頭が0ではなく、1から始まるということ。
0ベースではなく、1ベースの言語もあるので、これ自体はそれほど奇異でもない。
arr <- 1:9
arr[1]
 [1] 1

負数のインデックス

PythonやPHPなんかだと、配列に負数のインデックスでアクセスすると配列の末尾からのインデックスとなる。

Pythonの配列
arr = [1, 2, 3]
arr[-1]
# 3

これを使うと、わざわざlenとかを使って配列のサイズを取得しなくても、配列の末尾にアクセスできる。ところが、Rの場合は挙動が違う。

Rのvector
arr <- 1:9
arr[-1]
 [1] 2 3 4 5 6 7 8 9

Rで負のインデックスを指定すると、そのインデックスの要素を除去したものを返すをいうことになっている。
これは配列のインデックスが1ベースになっているからこそ、できる芸当だとも言える。

配列に対する演算子

これもPythonやPHPではおなじみの操作だけど、配列同士を結合するには"+"演算子を使う。

Pythonの配列+配列
arr1 = [1, 2, 3]
arr2 = [4, 5, 6]
arr3 = arr1 + arr2
# [1, 2, 3, 4, 5, 6]

Rでは
arr1 <- 1:3
arr2 <- 4:6
arr3 <- arr1 + arr2
 [1] 5 7 9

Rは統計計算用の言語なので、中身のデータを計算することに関心がある。そこで、演算子はvectorの各要素に適用される。
これは配列をオブジェクトとみなすか、要素に対する演算とみなすかのスタンスの違いとも言える。