2012-05-28 20 views
14

Hay 2 niveles de bucle. Cómo saltar a la próxima vez del ciclo del nivel superior cuando ocurre algo en el subnivel del ciclo?R Idioma: ¿Cómo saltar al siguiente ciclo de nivel superior?

¡Muchas gracias!

uuu=0 
for (i in 1:100) 
{ 
    uuu=uuu+1 
    j=1000 
    for(eee in 1:30) 
    { 
     j=j-1 
     if(j<990) 
     { 
      if j is smaller than 990 I hope start next time of i 
     } 
    } 
} 
+2

Ver: '' next' y break', pero aquí yo preferiría tener un bucle interno como: 'for (j en 1000: 970) {...}' – daroczig

Respuesta

22

¿Quieres next. Ver que es la página de ayuda: ?"next"

Aquí es un ejemplo tonto:

for(i in 1:10) { 
    for(j in 1:10) { 
     if(i < 5 || j <5) { 
      next 
     } else { 
      writeLines(paste("i =", i, " j=", j)) 
     } 
    } 
} 

Dar:

i = 5 j= 5 
i = 5 j= 6 
i = 5 j= 7 
i = 5 j= 8 
i = 5 j= 9 
i = 5 j= 10 
i = 6 j= 5 
i = 6 j= 6 
i = 6 j= 7 
i = 6 j= 8 
i = 6 j= 9 
i = 6 j= 10 
i = 7 j= 5 
i = 7 j= 6 
i = 7 j= 7 
.... 
7

Creo que desee utilizar break modo R dejará de bucle a través de su for bucle interno, por lo tanto, proceda con la siguiente iteración de su ciclo externo for:

for (i in 1:10) { 
    for (j in 1:10) { 
     if ((i+j) > 5) { 
     # stop looping over j 
     break 
     } else { 
     # do something 
     cat(sprintf("i=%d, j=%d\n", i, j)) 
     } 
    } 
} 
# i=1, j=1 
# i=1, j=2 
# i=1, j=3 
# i=1, j=4 
# i=2, j=1 
# i=2, j=2 
# i=2, j=3 
# i=3, j=1 
# i=3, j=2 
# i=4, j=1 
+1

1 - Estoy de acuerdo que este es la respuesta correcta a la pregunta del OP. Solo he agregado una respuesta yo mismo b/c Espero resaltar mejor cómo 'next' y' break' difieren. –

+0

Quizás solo agregue un indicador de ruptura para romper dos bucles – user1421972

13

@flodel tiene la respuesta correcta para esto, que es usar break en lugar de next. Desafortunadamente, el ejemplo en esa respuesta daría el mismo resultado independientemente de la construcción de flujo de control utilizada.

Voy a agregar el siguiente ejemplo para aclarar cómo difiere el comportamiento de las dos construcciones.

## Using `break` 
for (i in 1:3) { 
    for (j in 3:1) {  ## j is iterated in descending order 
     if ((i+j) > 4) { 
     break   ## << Only line that differs 
     } else { 
     cat(sprintf("i=%d, j=%d\n", i, j)) 
     }}} 
# i=1, j=3 
# i=1, j=2 
# i=1, j=1 

## Using `next` 
for (i in 1:3) { 
    for (j in 3:1) {  ## j is iterated in descending order 
     if ((i+j) > 4) { 
     next   ## << Only line that differs 
     } else { 
     cat(sprintf("i=%d, j=%d\n", i, j)) 
     }}} 
# i=1, j=3 
# i=1, j=2 
# i=1, j=1 
# i=2, j=2 ## << Here is where the results differ 
# i=2, j=1 ## 
# i=3, j=1 ## 
Cuestiones relacionadas