R:

2011-12-19 10 views
2

を平坦化することなく、CBINDを経由して、リストのリストは、我々は例えば、リスト内の要素としてペアを保存したいとしR:

1はを明示的に参照することなく、連結と同じものを作成したい場合
> 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 

外側のリストのインデックスは、自然なアプローチはc()に第二引数の「平坦化」を回避する方法はあり

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

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


[[2]] 
[1] 3 

[[3]] 
[1] 4 

である(このアプローチのための動機付けのための下にある[編集]を参照)、それによって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)) 
    } 
} 

ANSWER次のようになります。以下トミー、余分なリスト(で述べたように)必要とされています次のように動作します:

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

明らかに分かっているはずの種類です。トミーは、これは非常に良いことではないかもしれないと指摘する。

+0

あなたが探しているものはわかりませんが、 'c(list(1,2)、list(3、4))'ですか? – Ramnath

+1

一般的なコメントとして、あなたの実際の問題があなたのサンプルコードに似ているなら、リストの末尾に物を追加することは正しいアプローチです(あなたが発見したように、Rが厄介な場合)。面倒な単純な作業に遭遇したときには、その言語が使用される方法で問題を解決していないという良い兆候です。 – joran

+1

あなたはすぐに問題を把握してくれてうれしいです。そして、私が下で述べたことを繰り返しておきます:事前割り当て。この回答は、いくつかのパフォーマンスの比較を示しています。複雑な機能を使用して数分から数時間まで簡単に気球を膨張させることができます。がんばろう! http://stackoverflow.com/questions/4034059/iteratively-constructed-dataframe-in-rx – Chase

答えて

3

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

...しかし、一般的に、それはつまり、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を使用することができた場合、事前に割り当てられたリストにインデックスを使用して値を追加する(より高速/少ないメモリ)優れています通常はさらに効率的です:

+0

ありがとう、トミー! –