リスト

R のリストは、データフレームに似た操作を行えるデータ構造である。データフレームは列ベクトルを束ねて名前をつけて管理しているのに対して、リストは各要素を束ねて名前をつけて管理している。また、データフレームは、各要素(各列)が同じ長さである必要があるのに対して、リストは各要素が同じ長さでなくても構わない。そのため、リストは、リストの中にベクトル、行列、データフレーム、そしてリストを保存することができ、複雑な構造を取ることができる。

リストの作成

リストの要素数がわからないときは、list 関数で空のリストを作成して、あとから追加することができる。

x <- list()

x <- c(x, list(c(3, 3, 3, 3, 3)))
x <- c(x, list("I love R"))
x <- c(x, list(matrix(1:9, ncol = 3)))
x
## [[1]]
## [1] 3 3 3 3 3
## 
## [[2]]
## [1] "I love R"
## 
## [[3]]
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9

リストの要素数があらかじめわかっている場合は、要素数を指定して作成することもできる。例えば、要素数が 3 つのリストを作成するには次のようにする。

x <- vector("list", length = 3)
x
## x[[1]]
## NULL
## 
## x[[2]]
## NULL
## 
## x[[3]]
## NULL

また、リストの要素がすでに用意されているならば、リストを直接代入して作成することもできる。

x <- list(2 + 3i, c(1:5), array(1:10, dim = c(2, 5))
x
## [[1]]
## [1] 2+3i
## [[2]]
## [1] 1 2 3 4 5
## [[3]]
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    3    5    7    9
## [2,]    2    4    6    8   10

リストを入れ子構造にすることもできる。

x <- list(c(1, 2, 3), array(1:6, dim = c(3, 2))
y <- list(c(4, 5, 6), x)

y
## [[1]]
## [1] 4 5 6
## 
## [[2]]
## [[2]][[1]]
## [1] 1 2 3
## 
## [[2]][[2]]
##      [,1] [,2]
## [1,]    1    4
## [2,]    2    5
## [3,]    3    6

リスト要素の取得

リストの要素を取得するとき、添字で何番目の要素を取得するのかを指定する。たとえば、[[[2]]] はリストの 2 つめの要素を取得することができる。

x <- list(c(1, 2, 3), array(4:9, dim = c(3, 2)), c(T, F, F, T))
x
## [[1]]
## [1] 1 2 3
## 
## [[2]]
##      [,1] [,2]
## [1,]    4    7
## [2,]    5    8
## [3,]    6    9
## 
## [[3]]
## [1]  TRUE FALSE FALSE  TRUE
## 
## x[[2]]
##      [,1] [,2]
## [1,]    4    7
## [2,]    5    8
## [3,]    6    9

x[[2]][2]
## [1] 5 8

x[[2]][1]
## [1] 5

リストの名前

リストに名前をつけることができる。名前をつけると、添字の他に名前でリストの要素を取得できるようになる。他のプログラミング言語で利用されているハッシュや連想配列などの機能は、R ではリストに名前をつけて実現することができる。

x <- list(
     mat = matrix(0, nrow = 2, ncol = 4),
     vec = c(1, 2, 3, 4),
     arr = array(0, dim = c(2, 1, 1))
)

x[[2]]
## [1] 1 2 3 4

x$vec
## [1] 1 2 3 4

names 関数で、リストの名前を付け直すこともできる。

names(x) <- c("alpha", "beta", "gamma")

x
## $alpha
##      [,1] [,2] [,3] [,4]
## [1,]    0    0    0    0
## [2,]    0    0    0    0
## 
## $beta
## [1] 1 2 3 4
## 
## $gamma
## , , 1
## 
##      [,1]
## [1,]    0
## [2,]    0
## 

x$beta
## [1] 1 2 3 4

key <- "beta"
x[[key]]
## [1] 1 2 3 4