2011-05-06 16 views
7

Soy relativamente nuevo en R. Estoy iterando sobre un vector en R usando for() loop. Sin embargo, en función de una determinada condición, debo omitir algunos valores en el vector. El primer pensamiento que se me viene a la mente es cambiar el índice de ciclo dentro del ciclo. Lo he intentado pero de alguna manera no lo está cambiando. Debe haber algo de lo que lograr esto en R.cambiar el índice de bucle dentro del bucle

Gracias de antemano. Sami

+0

Sami - ¿Puedes publicar datos de muestra? – Chase

+0

Por favor dénos un código de ejemplo ... – EDi

+0

Probablemente está cambiando el índice dentro del ciclo pero el valor alterado no está cambiando la indexación para la siguiente pasada. La indexación en el nivel de control no se ve afectada por la alteración local de la variable de índice. –

Respuesta

9

Puede cambiar el índice del bucle dentro de una para bucle, pero no afectará la ejecución del bucle; ver la sección Detalles de ?"for":

The ‘seq’ in a ‘for’ loop is evaluated at the start of the loop; 
changing it subsequently does not affect the loop. If ‘seq’ has 
length zero the body of the loop is skipped. Otherwise the 
variable ‘var’ is assigned in turn the value of each element of 
‘seq’. You can assign to ‘var’ within the body of the loop, but 
this will not affect the next iteration. When the loop terminates, 
‘var’ remains as a variable containing its latest value. 

utilizar un bucle mientras que en vez y el índice manualmente:

i <- 1 
while(i < 100) { 
    # do stuff 
    if(condition) { 
    i <- i+3 
    } else { 
    i <- i+1 
    } 
} 
+1

Puede cambiar la variable de índice dentro de un bucle for, pero no se "pegará". –

+0

@DWin: De acuerdo. Quise decir "cambio" en el sentido que OP deseaba: omitir los valores. –

2

Sin un ejemplo, es difícil ver lo que quiere hacer, pero siempre se puede utilizar una sentencia if dentro de un bucle for:

foo <- 1:10*5 
for (i in seq(length(foo))) 
{ 
if (foo[i] != 15) print(foo[i]) 
} 
2

En R, alteraciones locales en la variable de índice se "corregidos" con la siguiente pasada:

for (i in 1:10){ 
    if (i==5) {i<-10000; print(i)} else{print(i)} 
       } 
#----- 
[1] 1 
[1] 2 
[1] 3 
[1] 4 
[1] 10000 
[1] 6 
[1] 7 
[1] 8 
[1] 9 
[1] 10 

Como tiene algún criterio para omitir, debe aplicar el criterio al vector de bucle dentro de los paréntesis. Por ejemplo:

for(i in (1:10)[-c(3,4,6,8,9)]) { 
      print(i)} 
#---- 
[1] 1 
[1] 2 
[1] 5 
[1] 7 
[1] 10 
+0

Saltarse el argumento 'seq' al bucle for supone que, a priori, usted sabe qué elementos omitir. Si ese es el caso, puede usar una solución vectorizada y omitir el ciclo por completo. –

8

Mira

?"next" 

El comando next se saltará el resto de la iteración actual del bucle y comenzar la siguiente. Eso puede lograr lo que quieres.

Cuestiones relacionadas