R でハッシュ・連想配列などを利用したいときはリスト型で代替する

リスト

R のリストは、ベクトルや行列とやや異なる性質を持ったデータ方である。ベクトルなどは、すべての要素が同じ属性でなければならない。例えば、数字と文字の両方を同時に持つベクトルは作れない。これに対して、リストは、数字と文字の両方を同時に保存できたりする。また、リストの中にリストを入れたりすることもできる。

リストの作成

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

x <- list()

x[[1]] <- c(3, 3, 3, 3, 3)
x[[2]] <- "I love R"

リストの要素数があらかじめわかっている場合は、要素数を指定して作成することもできる。例えば、要素数が 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