一日一膳(当社比)

RとJavaと時々数学

【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)