【R】listにlistを要素として追加しようとして1時間溶かした
Rでlistにlistを追加しようとしただけなのに1時間溶かしてしまったので、始末書がてら記事化します。
1. 行いたかったこと
つぎのようなlist l1, l2があるとします。
l1 <- list(
list(x=1, y=2),
list(x=3, y=4)
)
l2 <- list(x=5, y=6)
これらを結合してつぎのようなlistが作りたい。
list(
list(x=1, y=2),
list(x=3, y=4),
list(x=5, y=6)
)
listの追加ならappend
でうまくいくはず。
append(l1, l2)
が、ダメっ...! l2は展開されてしまうという結果に。
list(
list(x=1, y=2),
list(x=3, y=4),
x=5,
y=6
)
2. 解決法
a. nativeで書く方法
list1に要素を仮置きで追加したlistを作成し、そのあとl2へ参照させれば欲しいlistが得られます。
add1 <- function(l, new) {
tmp <- append(l, 0)
tmp[[length(l) + 1]] <- new
return(tmp)
}
add1(l1, l2)
b. rlang::exec
を使う
rlang
パッケージのexec
関数を使うと、 listを複数の引数に展開して関数に適用させることができます。
require(rlang)
add2 <- function(l, new) {
return(rlang::exec(list, !!!l1, l2))
}
add2(l1, l2)