2012-08-10 13 views
10

El siguiente código es visto comúnmente en lo que cuando se trata de la iteración en los valores del índice de una colección:índice de iteración lenguaje

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

El código se comporta mal cuando la colección está vacío porque 1:length(x) se convierte en 1:0 que da i la valores 1 y 0.

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 

Recuerdo haber visto un elegante lenguaje para la definición de una secuencia que no tiene elementos cuando x está vacía, pero no puedo recordarlo. ¿Qué idioma usas?

Respuesta

12

seq o seq_along le dan algo más razonable cuando su objeto de interés está vacío.

> 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

Perfecto, 'seq_along' era el modismo que vi. – Sim

+1

Pero si no necesita la variable de índice y solo desea recorrer los elementos de algo, una de lapply/sapply/vapply o algo del paquete plyr puede ser más elegante. – Spacedman

+0

@Spacedman Muy cierto y definitivamente es algo que el OP debería tener en cuenta. – Dason

Cuestiones relacionadas