2012-05-28 9 views
14

Es gibt 2 Ebenen der Schleife. Wie zum nächsten Mal der Schleife der obersten Ebene zu springen, wenn etwas in der Unterebene der Schleife passieren?R Sprache: Wie springt man zur nächsten Top-Level-Schleife?

Vielen Dank!

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

Siehe auch: '' next' und break', aber hier würde ich eher eine innere Schleife wie: 'for (j in 1000: 970) {...}' – daroczig

Antwort

22

Sie möchten next. Sehen Sie es Hilfeseite: ?"next"

Hier ist ein dummes Beispiel:

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

Giving:

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

Ich glaube, Sie break verwenden möchten, so wird R Schleife durch Ihre innere for Schleife zu stoppen, Fahren Sie daher mit der nächsten Iteration Ihrer äußeren for Schleife fort:

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 - Ich bin damit einverstanden, dass diese ist die richtige Antwort auf die Frage des OP. Ich habe nur eine Antwort selbst hinzugefügt b/c Ich hoffe, besser hervorzuheben, wie sich 'next' und' break' unterscheiden. –

+0

Fügen Sie einfach einen Unterbrechungsindikator hinzu, um zwei Schleifen zu unterbrechen – user1421972

13

@flodel hat die richtige Antwort dafür, das break anstatt next zu verwenden ist. Leider würde das Beispiel in dieser Antwort das gleiche Ergebnis liefern, egal welches Kontrollfluss-Konstrukt verwendet wurde.

Ich füge das folgende Beispiel nur um zu verdeutlichen, wie sich das Verhalten der beiden Konstrukte unterscheidet.

## 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 ## 
Verwandte Themen