2011-09-01 15 views
6

prendendo un esempio da An Introduction to RPericoloso per linguaggio di loop?

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]])) 
} 

Sembra che for(i in 1:length(yc)) { ... è un idioma per iterare su una lista o vettore nel caso in cui avete bisogno di una maniglia sulla indice corrente. Ciò tuttavia si interrompe nel caso di una lista vuota poiché 1:0 non è un vettore vuoto. Qual è l'idioma che dovrei usare per iterare sugli indici lista/vettore quando non ti è garantita una lista non vuota? Sto pensando if(length(yc)) for(i in 1:length(yc)) { ... ma c'è un modo migliore?

risposta

11

Stai cercando seq_along.

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

esattamente quello che stavo cercando – Keith

+2

... e uso 'seq_len' quando si ha la lunghezza già ... – Tommy

7

È possibile utilizzare seq_along:

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

Sono abbastanza sicuro che questo aggira il problema e dovrebbe essere un pochino più veloce.

+0

grazie Nick (ho avuto due buone risposte quasi allo stesso tempo) – Keith

4

Questa domanda è coperta a pagina 75 di 'The R Inferno': http://www.burns-stat.com/pages/Tutor/R_inferno.pdf

Ti dice un paio di altri modi per ottenere il ciclo sbagliato pure.

+0

Benvenuti a StackOverflow! Troverete che l'inferno R è tenuto in grande considerazione qui. È una grande risorsa, grazie! – Aaron

0

Per chi capita di imbattersi in questo - se si desidera un vettore di indice basato su lunghezza possibilmente zero, piuttosto che su un altro vettore, è possibile utilizzare in modo sicuro seq(1, length.out = L), dove L può essere un numero intero non negativo. Questo ti darà integer(0) se L == 0 e 1:L in caso contrario.

Ovviamente le altre soluzioni fornite qui sono più concise se L == length(something), ma ho avuto un problema in cui non era il caso, quindi ho pensato di scriverlo per la progenie.

Anche seq(1, length.out = L) può essere abbreviato come seq_len(L), che in base a ?seq è più veloce.