10

次のコードは、コレクションのインデックス値を反復処理する場合にSOでよく見られます。

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

コレクションが空の場合、コードは誤動作します。これ1:length(x)は、に値と1:0を与えるためです。i10

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思い出しますが、それを思い出せません。どのイディオムを使用していますか?

4

1 に答える 1

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
于 2012-08-10T02:23:48.223 に答える