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