2011-09-01 18 views
6

危険なforループイディオム?例にとり

xc <- split(x, ind) 
yc <- split(y, ind) 
for (i in 1:length(yc)) { 
    plot(xc[[i]], yc[[i]]) 
    abline(lsfit(xc[[i]], yc[[i]])) 
} 

An Introduction to Rからfor(i in 1:length(yc)) { ...はあなたが現在のインデックスのハンドルを必要とする場合には、リストまたはベクトルを反復処理のためのイディオムであると思われます。 1:0は空のベクトルではないので、これは空のリストの場合には破損します。空でないリストが保証されていないときに、リスト/ベクトルインデックスを反復するために使用するイディオムは何ですか?私はif(length(yc)) for(i in 1:length(yc)) { ...と思っていますが、より良い方法がありますか?

答えて

11

あなたが探しているのはseq_alongです。

> seq_along(as.list(1:2)) 
[1] 1 2 
> seq_along(list()) 
integer(0) 
+0

正確に何を探していたのですか? – Keith

+2

...あなたが長さを持っているときに 'seq_len'を使用してください... – Tommy

7

あなたはseq_alongを使用することができます。

for(i in seq_along(yc)) {...} 

が、私はこれが問題をバイパスし、はほんの少し速くする必要がありますかなり確信しています。 http://www.burns-stat.com/pages/Tutor/R_inferno.pdf

それはあなたが間違っているだけでなく、あなたのループを得るためにいくつかの他の方法を伝えます:

+0

ありがとうNick(ほぼ同時に2つの良い答えがあります) – Keith

4

この質問は「Rインフェルノ」の75ページに覆われています。

+0

ようこそStackOverflow!ここでRインフェルノは高く評価されています。それは素晴らしいリソースです、ありがとう! – Aaron

0

これに遭遇した人のために、別のベクトルではなく、おそらく長さゼロのインデックスベクトルが必要な場合は、seq(1, length.out = L)を安全に使用できます.Lは負ではない整数です。それ以外の場合はinteger(0)L == 0なら1:Lとなります。

もちろん、他の解決策はL == length(something)ならもっと簡潔ですが、私はそれが問題ではなかったので、私は子孫のために書き留めると思っていました。

また、は、seq_len(L)と略記することができます。これは、?seqによると高速です。

関連する問題