2016-06-01 17 views
2

Sehr einfaches Beispiel-Code (nur für die Demonstration, keine Verwendung überhaupt):Ausbruch aus verschachtelten Schleifen in R

repeat { 
    while (1 > 0) { 
    for (i in seq(1, 100)) { 
     break # usually tied to a condition 
    } 
    break 
    } 
    break 
} 
print("finished") 

Ich möchte ohne separat in jeder Schleife break unter Verwendung von mehreren Schleifen auszubrechen. Nach a similar question regarding python, scheint meine Schleifen in eine Funktion Einwickeln eine mögliche Lösung zu sein, das heißt mit return() in der Funktion aus jeder Schleife brechen:

nestedLoop <- function() { 
    repeat { 
    while (1 > 0) { 
     for (i in seq(1, 100)) { 
     return() 
     } 
    } 
    } 
} 

nestedLoop() 
print("finished") 

Gibt es noch andere Methoden in R zur Verfügung? Vielleicht etwas wie das Beschriften von Schleifen und das Spezifizieren welcher Schleife zu brechen (wie in Java)?

+2

ich jetzt nicht andere Methoden und verwenden würde 'return' wie diese. Aber natürlich habe ich seit Monaten keine verschachtelte R-Schleife geschrieben und habe seit Jahren keine R-While- oder Repeat-Schleife mehr benutzt. – Roland

+0

Das Problem, das ich habe, wenn ich meine Schleifen in eine Funktion einpacke, ist, dass ich möglicherweise große Listen von Variablen innerhalb der Schleifen zurückgeben muss, um sie in die globale Umgebung zu bringen, wenn sie an anderer Stelle in meinem Code benötigt werden. – Robomatix

+0

Nein, Ihr Problem verwendet so viele Schleifen. Effizienter R-Code verwendet selten verschachtelte Schleifen. – Roland

Antwort

0

Ich denke Ihre Methode, Ihre verschachtelten Schleifen in eine Funktion zu wickeln, ist der sauberste und wahrscheinlich beste Ansatz. Sie können tatsächlich return() in der globalen Umwelt nennen, aber es wird einen Fehler werfen und sieht hässlich aus, etwa so:

for (i in 1:10) { 
    for (a in 1:10) { 
    for(b in 1:10) { 

     if (i == 5 & a == 7 & b == 2) { return() } 

    } 
    } 
} 

print(i) 
print(a) 
print(b) 

, die wie folgt in der Befehlszeile aus:

> for (i in 1:10) { 
+ for (a in 1:10) { 
+  for(b in 1:10) { 
+  
+  if (i == 5 & a == 7 & b == 2) { return() } 
+  
+  } 
+ } 
+ } 
Error: no function to return from, jumping to top level 
> 
> print(i) 
[1] 5 
> print(a) 
[1] 7 
> print(b) 
[1] 2 

Offensichtlich weit Besser und sauberer, um die Funktionsmethode zu verwenden.

EDIT:

Added eine alternative Lösung zur Herstellung der Fehler von Roland gegeben schöner aussehen:

for (i in 1:10) { 
    for (a in 1:10) { 
    for(b in 1:10) { 

     if (i == 5 & a == 7 & b == 2) { stop("Let's break out!") } 

    } 
    } 
} 

print(i) 
print(a) 
print(b) 
+0

Nun, Sie könnten einfach einen Fehler direkt mit 'simpleError' stattdessen werfen. – Roland

+0

Ersetzen von 'return()' mit 'simpleError (" ", call = return())' wirft immer noch den Fehler in der Konsole, obwohl ich "simpleError" vorher nicht gesehen habe, damit ich es möglicherweise falsch benutze. – giraffehere

+0

Probieren Sie 'stop (" Lasst uns ausbrechen! ")', Was ein 'simpleError'-Objekt zurückgibt. – Roland

Verwandte Themen