2012-08-10 13 views
10
それは、コレクションのインデックス値を反復処理するために来るとき、次のコードは、一般的にSO上で見られている

インデックス反復イディオム

for (i in 1:length(x)) { 
    # ... 
} 

コレクションが空であるとき1:length(x)i与え1:0なるためのコードでは、誤動作値10です。

iterate <- function(x) { 
    for (i in 1:length(x)) { 
     cat('x[[', i, ']] is', x[[i]], '\n') 
    } 
} 

> iterate(c(1,2,3)) 
x[[ 1 ]] is 1 
x[[ 2 ]] is 2 
x[[ 3 ]] is 3 

> iterate(c()) 
x[[ 1 ]] is 
x[[ 0 ]] is 

私はxは空ですが、私はそれを思い出すことができないとき要素がないシーケンスを定義するためのエレガントなイディオムを見て思い出します。どのようなイディオムを使用していますか?

答えて

12

seqまたはseq_alongは、対象オブジェクトが空の場合には、より合理的なものを提供します。

> x <- NULL 
> seq(x) 
integer(0) 
> seq_along(x) 
integer(0) 
> x <- rnorm(5) 
> seq(x) 
[1] 1 2 3 4 5 
> seq_along(x) 
[1] 1 2 3 4 5 
+0

「seq_along」は私が見たイディオムでした。 – Sim

+1

しかし、インデックス変数を必要とせず、何かの要素をループしたい場合は、lapply/sapply/vapplyのいずれか、またはplyrパッケージからのものがよりエレガントになるかもしれません。 – Spacedman

+0

@Spacedman非常に真実で、OPが心に留めておくべきことは間違いありません。 – Dason

関連する問題