wake-up-neo.com

do-while-Schleife in R

Ich habe mich gefragt, wie man eine Do-while-Style-Schleife schreibt.

Ich habe diesen Beitrag gefunden :

sie können repeat {} verwenden und Bedingungen überprüfen, wo auch immer if () und Beenden Sie die Schleife mit dem Steuerelement "break".

Ich bin nicht sicher, was es genau bedeutet. Kann jemand bitte etwas näher erläutern, wenn Sie es verstehen und/oder wenn Sie eine andere Lösung haben?

52
Tim

Ziemlich selbsterklärend.

repeat{
  statements...
  if(condition){
    break
  }
}

Oder so ähnlich würde ich denken. Um die Auswirkung der do while-Schleife zu erhalten, überprüfen Sie einfach am Ende der Anweisungsgruppe Ihren Zustand.

91
A Salcedo

Siehe ?Control oder die Sprachdefinition R:

> y=0
> while(y <5){ print( y<-y+1) }
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5

do_while existiert also nicht als separates Konstrukt in R, aber Sie können es mit:

repeat( { expressions}; if (! end_cond_expr ) {break} )

Wenn Sie die Hilfeseite anzeigen möchten, können Sie nicht ?while oder ?repeat an der Konsole eingeben, sondern müssen ?'repeat' oder ?'while' verwenden. Alle "Kontroll-Konstrukte" einschließlich if befinden sich auf derselben Seite und alle müssen nach dem "?" Der Interpreter sieht sie daher nicht als unvollständigen Code an und gibt Ihnen eine Fortsetzung "+".

19
42-

Aufbauend auf den anderen Antworten wollte ich ein Beispiel zeigen, wie man die while-Schleife verwendet, um ein Do-while-Verhalten zu erreichen. Durch die Verwendung einer einfachen booleschen Variablen in der while-Bedingung (initialisiert auf TRUE) und überprüfen Sie später unsere tatsächliche Bedingung in der if-Anweisung. Man könnte auch ein break-Schlüsselwort anstelle von continue <- FALSE in der if-Anweisung verwenden (wahrscheinlich effizienter). 

  df <- data.frame(X=c(), R=c())  
  x <- x0
  continue <- TRUE

  while(continue)
  {
    xi <- (11 * x) %% 16
    df <- rbind(df, data.frame(X=x, R=xi))
    x <- xi

    if(xi == x0)
    {
      continue <- FALSE
    }
  }
5
Daniel D.

Bemerken, dass der perfekte Ansatz des Benutzers 42 {
* "do while" = "Wiederholen bis nicht"
* Die Code-Äquivalenz:

do while (condition) # in other language
..statements..
endo

repeat{ # in R
  ..statements..
  if(! condition){ break } # Negation is crucial here!
}

} haben von den anderen nicht genug Aufmerksamkeit erhalten, ich werde seinen Ansatz anhand eines konkreten Beispiels hervorheben und vorbringen. Wenn man die Bedingung in do-while nicht annulliert (via ! oder durch Negation), dann gibt es je nach Ablauf des Codes verzerrte Situationen (1. Wertepersistenz 2. Endlosschleife).

In Gauß:

proc(0)=printvalues(y);
DO WHILE y < 5;    
y+1;
 y=y+1;
ENDO;
ENDP;
printvalues(0); @ run selected code via F4 to get the following @
       1.0000000 
       2.0000000 
       3.0000000 
       4.0000000 
       5.0000000 

In R:

printvalues <- function(y) {
repeat {
 y=y+1;
print(y)
if (! (y < 5) ) {break}   # Negation is crucial here!
}
}
printvalues(0)
# [1] 1
# [1] 2
# [1] 3
# [1] 4
# [1] 5

Ich bestehe immer noch darauf, dass Salcedos Antwort falsch ist, ohne die Bedingung in do-while zu negieren. Dies kann durch Entfernen des Negationssymbols im obigen Code überprüft werden.

0
Erdogan CEVHER