1

R でリストのリストを事前に初期化し始めたとき、後で入力する必要があるため、rep() で値として使用した場合のリスト オブジェクトの動作について疑問に思いました。私が次のことをしようとしているとき...

listOfLists <- rep(list(1, 2), 4)

... listOfLists は単一のリストです:

1 2 1 2 1 2 1 2

ただし、最終的に値 1 と 2 をそれぞれ含むリストのリストであると想定します。

1 2
1 2
1 2
1 2

目的の結果を得るには、値のエントリをさらに c() で囲む必要があります。

listOfLists <- rep(list(c(1, 2)), 4)

なぜこれがRの場合なのだろうか.リストは、c()に似た何かをする代わりに、通常のように完全に機能するリストを作成するべきではありませんか? c() で値をグループ化すると、実際にここで問題が解決するのはなぜですか?

ご感想ありがとうございます!


結論: Ben Bolker と Peyton の両方の投稿が最終的な答えです。これは、list() 関数の動作でも c() 関数の動作でもありません。代わりに、rep() はリストとベクトルのエントリを 1 つに結合するようです。値を別のコンテナーで囲むと、rep() は実際には最初のコンテナーを「無視」しますが、2 番目のコンテナーを繰り返します。

4

2 に答える 2

4

あなたが得たものはリストのリストでrep(list(c(1, 2)), 4)はありません。これは数値ベクトルのリストです。本当にリストのリストが必要な場合は、試してください

replicate(4,list(1,2),simplify=FALSE)

また

rep(list(list(1, 2)), 4)

の最初の行で解釈を実行すると、これが機能する理由を少しよく理解できます。?rep

「rep」は「x」の値を複製します。

つまり、 の内容を複製することを約束しますxが、必ずしもxそれ自体を複製するとは限りません。(これが、@flodel によって親切に提供された 2 番目の提案が機能する理由です。内容xがリストであるリストを作成し、ベクトルベースが機能する理由です。リストの内容はベクトルです。)rep()

于 2013-06-01T18:11:01.503 に答える
2

完全に機能するリストを作成します。違いは、最初の例では 2 つの要素を持つリストを作成するのに対し、2 番目の例では 1 つの要素 (ベクトル) を持つリストを作成することです。

リストを (たとえば で) 結合すると、rep本質的には、以前のリストのすべての要素を含む新しいリストを作成することになります。最初の例では 8 つの要素があり、2 番目の例では 4 つの要素があります。

これを確認する別の方法:

> length(list(1, 2))
[1] 2
> c(list(1, 2), list(1, 2), list(1, 2))
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 1

[[4]]
[1] 2

[[5]]
[1] 1

[[6]]
[1] 2

> length(list(1:2))
[1] 1
> c(list(1:2), list(1:2), list(1:2))
[[1]]
[1] 1 2

[[2]]
[1] 1 2

[[3]]
[1] 1 2
于 2013-06-01T18:13:45.533 に答える