他のプログラミング言語の連想配列やハッシュ関数と概ね同等ですが、構造体などがないので複合データは必ずリストになります。リストが苦手だと不自由な環境ですが、ここにあるぐらいの事をざっと把握しておくと、不自由がだいぶ減ります。
リストを作成
大した話ではなく、気軽に作れます。
中身のあるリストを作成
lst <- list("a"=123, "b"=456, "c"=789)
lst
$a
[1] 123
$b
[1] 456
$c
[1] 789
ベクターをリストに変えて、名前をつける
lst <- as.list(c(123, 456, 789))
names(lst) <- c("a", "b", "c")
lst
$a
[1] 123
$b
[1] 456
$c
[1] 789
ベクトルのリストをつくる
リストの要素の長さは異なっても問題ないです。
vlst <- list("a"=c(1, 2, 3), "b"=c(4, 5, 6), "c"=c(7, 8, 9, 10))
vlst
$a
[1] 1 2 3
$b
[1] 4 5 6
$c
[1] 7 8 9 10
値を評価しないで入れる
list
は要素の値に式が指定すると、リストに入れる前に評価しますが、alist
は式をクロージャ(call
オブジェクト)として格納して評価を避けられます。
if(exists("y")) rm(y)
# list(x=y^2) # エラーになる
alist(x=y^2) # エラーにならない
$x
y^2
空要素を入れる
関数オブジェクトを操作するような特殊な用途でしか使わないと思いますが、空要素を入れることもできます。
list(a=1, quote(expr=), b=2)
$a
[1] 1
[[2]]
$b
[1] 2
リストのサブセットをつくる
リストの一部分のリストをつくるのも簡単です。
n番目の要素だけを抽出したリストを作る
$a
[1] 123
名前指定で一部の要素のリストを作る
$b
[1] 456
$c
[1] 789
各要素のn番目の値だけで作りなおす
これはやや複雑で、lapply
でリストの各要素をgetElement
関数のsynonymである[[
で処理しています。
# リストの各要素の3番目の値だけで、リストを作りなおす
lapply(vlst, "[[", 3)
$a
[1] 3
$b
[1] 6
$c
[1] 9
リストの要素の値を参照する
[1] 456
# 3番目の要素の値を得る
getElement(lst, 3)
[1] 789
# 名前"a"の要素の値を得る
lst[["a"]]
[1] 123
いちいちリストを指定しないで、中身を参照する
with(list(a = 1, b = 2, c = 3), {
a + b + c
})
[1] 6
リストにデータを追加する
複数のリストを統合する
# "d"を追加する
c(lst, list(x=0.1, y=0.2, z=-0.1))
$a
[1] 123
$b
[1] 456
$c
[1] 789
$d
[1] 0
$x
[1] 0.1
$y
[1] 0.2
$z
[1] -0.1
リストからデータを削除する
# "b"を消す
lst["b"] <- NULL
リストに要素があるか調べる
# 名前"d"の要素が含まれているか調べる
if(!is.null(lst[["d"]])) print("名前dの要素は無い")
[1] "名前dの要素は無い"
リストの要素の名前をすべて得る
[1] "a" "c" "d"
リストの要素をすべて得る
a c d
123 789 0
unlist(lst, use.names = FALSE) # ベクトルの要素にラベルをつけない
[1] 123 789 0
リストの中身を操作する
# 全部の要素から17を引いたリストをつくる
lapply(lst, function(x){ x - 17 })
$a
[1] 106
$c
[1] 772
$d
[1] -17
# 全部の要素に31を足したベクトルを得る
sapply(lst, function(x){ x + 31 })
a c d
154 820 31
# リストの各要素の2番目の値を取り出す
sapply(vlst, "[[", 2) # "[["はgetElementでもOK
a b c
2 5 8