2012-08-10 8 views
10

Il codice seguente è comunemente visto su SO quando si tratta di scorrere il valori di indice di una collezione:Indice iterazione linguaggio

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

Il codice misbehaves quando l'insieme è vuoto perchè 1:length(x) diventa 1:0 che dà i la valori 1 e 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 

mi ricordo di aver visto un elegante linguaggio per la definizione di una sequenza che non ha elementi quando x è vuota ma non riesco a ricordare. Che idioma usi?

risposta

12

O seq o seq_along ti danno qualcosa di più ragionevole quando il tuo oggetto di interesse è vuoto.

> 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

Perfetto, 'seq_along' era l'idioma che ho visto. – Sim

+1

Ma se non hai bisogno della variabile index e vuoi semplicemente eseguire il loop sugli elementi di qualcosa, uno di lapply/sapply/vapply o qualcosa del pacchetto plyr potrebbe essere più elegante. – Spacedman

+0

@Spacedman Molto vero ed è sicuramente qualcosa che l'OP dovrebbe tenere a mente. – Dason