Ausbrechen aus verschachtelten Schleifen in R
Sehr einfaches Beispiel-code (nur für demonstration, keine Nutzung):
repeat {
while (1 > 0) {
for (i in seq(1, 100)) {
break # usually tied to a condition
}
break
}
break
}
print("finished")
Ich will ausbrechen aus mehreren Schleifen ohne Verwendung break
in jeder Schleife getrennt.
Nach eine ähnliche Frage bezüglich python, packe meine Schleifen in eine Funktion zu sein scheint, eine mögliche Lösung, d.h. mit return()
zu brechen jede Schleife in der Funktion:
nestedLoop <- function() {
repeat {
while (1 > 0) {
for (i in seq(1, 100)) {
return()
}
}
}
}
nestedLoop()
print("finished")
Gibt es andere Methoden, die Sie R? Vielleicht so etwas wie die Kennzeichnung Schleifen und dann angeben, welche Schleife zu brechen (wie in Java) ?
- Ich jetzt nicht, andere Methoden und würde
return
wie diese. Aber natürlich, ich habe nicht geschrieben, eine geschachtelte R-Schleife in Monaten und habe nicht ein Rwhile
oderrepeat
Schleife in Jahren. - Das problem, dass ich mit der Verpackung meine Schleifen in einer Funktion ist, dass ich möglicherweise haben, um wieder große Listen von Variablen innerhalb der Schleifen, um Sie an die Umwelt, wenn Sie anderswo benötigt werden in meinem code.
- Nein, dein problem ist mit so vielen loops. Effiziente R-code nur selten verwendet geschachtelte Schleifen.
- Mithilfe von geschachtelten Schleifen ist vielleicht nicht die eleganteste Art und Weise, Probleme zu lösen, aber manchmal notwendig, d.h. die Adressierung jeder Wert der matrix getrennt. Auch einige etablierte algorithmen verwenden von geschachtelten Schleifen. Und manchmal ich will einfach nur, um meine Arbeit zu erledigen, ohne Verbesserung meines codes die Leistung bis an die Grenze.
- Wir sprechen hier nicht über die Einnahme die Leistung bis an die Grenze, sondern um Größenordnungen, die in Zeiten.
- Ich denke, Sie möchte etwas zurückgeben.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwendung von expliziten Markierungen und Aufbrechen von Schleifen bedingt auf diese flags können Ihnen eine weitere Flexibilität. Beispiel:
Dem obigen code, wird brechen die zwei verschachtelten Schleifen, wenn
i=3
. Wenn die Letzte Zeile (if (stop){break}
) auskommentiert ist, dann wird nur die innere Schleife unterbrochen beii=3
, aber die äußere Schleife läuft weiter, d.h. es praktisch überspringt die Fälle voni=3
. Diese Struktur ist einfach zu spielen, um mit, und ist so flexibel, wie man brauchen kann.Ich denke, Ihre Methode der Verpackung Ihrer verschachtelten Schleifen in eine Funktion ist die sauberste und wahrscheinlich der beste Ansatz. Sie kann tatsächlich rufen
return()
im globalen Umfeld, aber es wirft einen Fehler und sieht häßlich aus, etwa so:Aussieht, wie dies in der Befehlszeile:
Natürlich weit besser und sauberer mit der Funktion " Methode.
EDIT:
Hinzugefügt, eine alternative Lösung zu machen, die Fehler schöner Aussehen gegeben, das von Roland:
simpleError
statt.return()
mitsimpleError("", call = return())
noch wirft die Fehlermeldung in der Konsole, obwohl ich noch nicht gesehensimpleError
vor, also kann ich es auch nicht richtig.stop("Let's break out!")
das gibt einensimpleError
Objekt.