web-dev-qa-db-fra.com

Comment passer à la prochaine boucle de niveau supérieur?

J'ai une boucle for imbriquée dans une autre boucle for. Comment puis-je faire en sorte que lorsque quelque chose se passe dans la boucle interne, nous sortons et sautons à la prochaine itération de la boucle externe?

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
        }
    }
}
15
user1421972

@flodel a la bonne réponse à cela, qui est d'utiliser break plutôt que next. Malheureusement, l'exemple de cette réponse donnerait le même résultat, quelle que soit la construction de flux de contrôle utilisée.

J'ajoute l'exemple suivant juste pour montrer clairement comment le comportement des deux constructions diffère.

## 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   ##
16
Josh O'Brien

Je pense que vous voulez utiliser break pour que R arrête de parcourir votre boucle intérieure for, donc passez à la prochaine itération de votre boucle externe 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
9
flodel