R:平坦化せずにcbindを介したリストのリスト

ペアを要素としてリストに格納したいとします(例:

> x <- list()
> x[[1]] <- list(1,2)
> x[[2]] <- list(3,4)
> x
[[1]]
[[1]][[1]]
[1] 1

[[1]][[2]]
[1] 2


[[2]]
[[2]][[1]]
[1] 3

[[2]][[2]]
[1] 4

外側のリストのインデックスを明示的に参照することなく連結して同じものを作成したい場合、自然なアプローチ(このアプローチの動機については下記のEDITを参照)は

> c(list(list(1,2)),list(3,4))
[[1]]
[[1]][[1]]
[1] 1

[[1]][[2]]
[1] 2


[[2]]
[1] 3

[[3]]
[1] 4

c()への第2引数の「平坦化」を回避し、連結を使用して x を生成する方法はありますか?

編集:私は意図したアプリケーションを明確にする必要があります。

結局、ループをたどっていくうちに、リストにペアを追加したいと思います。現時点では、メインリストのインデックスを維持していますが、 c を使用した方がおそらくより自然です。明示的なインデックスを使用すると、ループは次のようになります

index <- 1
l <- list()
for (i in 1:10) {
    for (j in (i+1):10) {
        if ( (i+j)%%2 == 0 ) {
            l[[index]] <- list(i,j)
            index <- index + 1
        }
    }
}

そして、失敗した c の使用は次のようになります

l <- list()
for (i in 1:10) {
    for (j in (i+1):10) {
        if ( (i+j)%%2 == 0 )
            l <- c(l,list(i,j))
    }
}

答え:下記のTommyが指摘しているように、余分なリスト()が必要なので、次のように動作します:

l <- list()
for (i in 1:10) {
    for (j in (i+1):10) {
        if ( (i+j)%%2 == 0 )
            l <- c(l,list(list(i,j)))
    }
}

私が理解しておくべき明らかなものの種類。トミーは、これは非常に良いことではないかもしれないと指摘する。

2
あなたの即時の問題が分かったことをうれしく思います。この回答は、いくつかのパフォーマンスの比較を示しています。複雑な機能を使用して数分から数時間まで簡単に気球を膨張させることができます。がんばろう! stackoverflow.com/questions/4034059/…
一般的なコメントとして、あなたの実際の問題があなたのサンプルコードに似ている場合、リストの末尾に物を追加することは正しいアプローチです(あなたが見つけたように、Rで扱いにくい場合)。面倒な単純な作業に遭遇したときには、その言語が使用される方法で問題を解決していないという良い兆候です。
追加された 著者 joran,
私は現時点でそれを見つけることができませんが、私は誰かを思い出しています(リプリー?)ある時点では、実際にはサイズの野生の過大評価で事前に割り当てるほうが速いと思います。よく)。それが完全にあなたの質問に答えることはできませんが、それは私が瞬間に得たものです。
追加された 著者 joran,
c(list(1,2)、list(3、4))ですか?
追加された 著者 Ramnath,
@ジョラン、@チェイス:私はすぐに何かをノックしていたので、貧しいデザインはこのインスタンスでは関係ありませんでした。しかし、私はあなたの一般的なポイントを取って、そして質問が残っています:データ構造のサイズ(例えば、リスト)の合理的な上限を持たない場合、あなたは何をしますか?何かを割り当てて、必要に応じて動的に成長させますか?
追加された 著者 Rahul Savani,

1 答え

私は単純な答えは "いいえ、余分なリスト(ラッパー)"が必要だと思います。

...but in general, it is better (faster/less memory) to add values using indexing to a pre-allocated list than using c()

x <- NULL
for(i in 1:2) x <- c(x, list(list(i,i+1)))
x

x <- vector('list', 2)
for(i in seq_along(x)) x[[i]] <- list(i,i+1)
x

また、 lapply を使用できる場合は、通常はさらに効率的です。

lapply(1:2, function(i) list(i, i+1))
3
追加された
ありがとう、トミー!
追加された 著者 Rahul Savani,