CやJavaに慣れたプログラマーがRを使おうとすると、配列の扱いという基本的なところで、いきなり戸惑ってしまうことがある。
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にはスカラーはない。
0ベースではなく、1ベースの言語もあるので、これ自体はそれほど奇異でもない。
Pythonの配列
これを使うと、わざわざlenとかを使って配列のサイズを取得しなくても、配列の末尾にアクセスできる。ところが、Rの場合は挙動が違う。
Rのvector
Rで負のインデックスを指定すると、そのインデックスの要素を除去したものを返すをいうことになっている。
これは配列のインデックスが1ベースになっているからこそ、できる芸当だとも言える。
Pythonの配列+配列
Rでは
Rは統計計算用の言語なので、中身のデータを計算することに関心がある。そこで、演算子はvectorの各要素に適用される。
これは配列をオブジェクトとみなすか、要素に対する演算とみなすかのスタンスの違いとも言える。
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の各要素に適用される。
これは配列をオブジェクトとみなすか、要素に対する演算とみなすかのスタンスの違いとも言える。
0 件のコメント:
コメントを投稿