web-dev-qa-db-fra.com

boucle do-while en R

Je me demandais comment écrire une boucle do-while-style?

J'ai trouvé ce post :

vous pouvez utiliser repeat {} et vérifier les conditions partout en utilisant if () et quittez la boucle avec le mot de contrôle "break".

Je ne suis pas sûr de ce que cela signifie exactement. Quelqu'un peut-il préciser si vous le comprenez et/ou si vous avez une solution différente?

52
Tim

Assez explicite.

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

Ou quelque chose comme ça, je pense. Pour obtenir l’effet de la boucle do while, vérifiez simplement votre condition à la fin du groupe.

91
A Salcedo

Voir ?Control ou le R Définition du langage:

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

Donc, do_while n'existe pas en tant que construction distincte dans R, mais vous pouvez le simuler avec:

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

Si vous voulez voir la page d’aide, vous ne pouvez pas taper ?while ou ?repeat sur la console, mais vous devez plutôt utiliser ?'repeat' ou ?'while'. Toutes les "constructions de contrôle", y compris if, sont sur la même page et nécessitent un caractère après le caractère "?" de sorte que l'interprète ne les voit pas comme du code incomplet et vous donne une suite "+".

19
42-

En me basant sur les autres réponses, je souhaitais partager un exemple d'utilisation de la construction de la boucle while pour obtenir un comportement de do-while. En utilisant une simple variable booléenne dans la condition while (initialisée à TRUE), puis en vérifiant notre condition réelle ultérieurement dans l'instruction if. On pourrait aussi utiliser un mot-clé break au lieu de continue <- FALSE dans l’instruction if (probablement plus efficace). 

  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.

Remarquant l'approche parfaite de cet utilisateur 42 - {
* "do while" = "répète jusqu'à ne pas"
* L'équivalence de code:

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

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

} Je n'ai pas reçu suffisamment d'attention des autres, je soulignerai et présenterai son approche à l'aide d'un exemple concret. Si l'on n'annule pas la condition en do-while (via ! ou en prenant négation), des situations déformées (1. valeur persistante 2. boucle infinie) existent en fonction de l'évolution du code.

En Gauss:

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 

En 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

Je toujours insiste sur le fait que, sans la négation de la condition dans le do-while, la réponse de Salcedo est fausse. On peut vérifier cela en supprimant le symbole de négation dans le code ci-dessus.

0
Erdogan CEVHER