[R] vectorとlistの関係

2018年4月16日月曜日

R

generic vector

Rのドキュメントを見ると、listの説明として、"Generic Vectors"という言葉が出てくる。

https://www.rdocumentation.org/packages/base/versions/3.4.3/topics/list

んー、なんだこれ。と思ったんだけど、vector関数の挙動を見たら、なんとなくわかったような気がする。

atomic vectorとgeneric vector

まず、すべてデフォルト値で初期化された数値ベクトルを作るにはこうする。
v <- vector(mode = "numeric", length = 2)
v
 [1] 0 0

numericのデフォルト値(0)で、長さ2のベクトルが作られる。

一方、modeを"list"にすると、デフォルト値(0)で、長さ2のリストが作られる。
l <- vector(mode = "list", length = 2)
l
 [[1]]
 NULL

 [[2]]
 NULL

Rでは、最初の例のような、vectorの中にvectorを持たない連続データ構造(いわゆる配列)を"atomic vector"、2つ目の例のようにvectorの中にvectorを持つデータ構造(いわゆる配列の配列)を"generic vector"と呼ぶ。

https://www.rdocumentation.org/packages/base/versions/3.4.3/topics/vector

ただし、ただ"vector"と言った場合は"atomic vector"、"list"と言った場合は"generic vector"を指しているみたい。

vector関数

さて、先ほどのvector関数だけど、modeやlengthを指定しなかった場合はどうなっちゃうんだろうか。
vemp <- vector()
vemp
 logical(0)
length(vemp)
 [1] 0

これは以下のように、vector(mode = "logical", length = 0) としているのと同じになる。
vemp <- vector(mode = "logical", length = 0)
vemp
 logical(0)

lengthだけを指定すると、logicalのデフォルト値であるFALSEになる。
vemp <- vector(length = 2)
vemp
 [1] FALSE FALSE

vectorとlistの相互変換

as.listを使って、ベクトルをリストに変換したり、as.vectorを使って、リストをベクトルに変換することもできる。
v <- c(4, 5, 6)
as.list(v)
 [[1]]
 [1] 4

 [[2]]
 [1] 5

 [[3]]
 [1] 6

l <- list("a" = 1, "b" = 2, "c" = 3)
as.vector(l, mode = "numeric")
 [1] 1 2 3