boucle for comme en C

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Eric Wajnberg
Messages : 778
Enregistré le : 11 Aoû 2008, 15:37
Contact :

boucle for comme en C

Messagepar Eric Wajnberg » 11 Mai 2021, 09:41

Bonjour à tous,

Je dois programmer un algo un peu compliqué, et j'ai un "twist" avec les boucles for que je ne sais pas résoudre.

La base de ma question est simple, et suit la syntaxe suivante :

Code : Tout sélectionner

> for (i in 1:3) cat(i,"\n")
1
2
3

Si j'écrivais ceci en C, par exemple, j'aurais :

Code : Tout sélectionner

for (i = 1; i <= 3; i++)
printf ("%d\n", i);

1
2
3

Si la boucle doit aller dans l'autre sens, en C, par exemple, aucun tour de boucle ne se fait, et c'est le comportement souhaité :

Code : Tout sélectionner

for (i = 3; i <= 1; i++)
printf ("%d\n", i);

Ce qui est très pratique, algorithmiquement. Ce n'est pas le cas dans R, où des tours de boucle se font tout de même dans l'autre sens :

Code : Tout sélectionner

> for (i in 3:1) cat(i,"\n")
3
2
1

Ceci est du à l'argument "by" de seq() (fonction qui est elle-même un argument du for()) qui est calculé automatiquement pour décroitre si nécessaire. Et, évidement, je ne peux pas forcer le sens à ma guise :

Code : Tout sélectionner

> seq(3,1,by=1)
Error in seq.default(3, 1, by = 1) : signe incorrect de l'argument 'by'

Je peux évidement - et facilement - rajouter des lignes de code pour bloquer les tours de boucle si nécessaire, mais je m'interrogeais de savoir s'il y aurait un moyen syntaxique pour que R, à cet égard, fonctionne comme d'autres langages de programmation, comme le C par exemple. Je n'ai rien trouvé sur ce point.

D'avance merci pour toute aide sur cette question.

Eric.

Eric Casellas
Messages : 767
Enregistré le : 06 Jan 2009, 14:59

Re: boucle for comme en C

Messagepar Eric Casellas » 11 Mai 2021, 11:23

Bonjour,

Un code R qui se comporte comme tu l'attend:

Code : Tout sélectionner

seqC <- function(start, stop) {
  X <- NULL;
  try(X <- seq(start,stop,by=1), silent=TRUE)
  return(X)
}

for (i in seqC(3,1)) cat(i,"\n")


Mais sinon pour moi l'équivalent du code R

Code : Tout sélectionner

for (i in 3:1)

serait plutôt en C

Code : Tout sélectionner

for (i = 3; i <= 1; i--)


Eric
Eric

Eric Wajnberg
Messages : 778
Enregistré le : 11 Aoû 2008, 15:37
Contact :

Re: boucle for comme en C

Messagepar Eric Wajnberg » 11 Mai 2021, 11:28

Merci Eric,

Oui, utiliser try() est une bonne idée. Je n'y avais pas pensé. Je n'ai pas trop le réflexe de l'usage de cette fonction.

Merci.

Oui avec "i--" en C on récupère le même comportement, mais ce n'était pas ma question. Dans mon code start et stop ne sont pas connus a priori.

Encore merci, Eric.

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: boucle for comme en C

Messagepar Pierre-Yves Berrard » 11 Mai 2021, 11:32

Bonjour,
Un petit while devrait aussi faire l'affaire.
PY

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: boucle for comme en C

Messagepar Mickael Canouil » 11 Mai 2021, 14:06

Bonjour,

Pourquoi faire un try, quand la condition est start > stop ?

Code : Tout sélectionner

seqC <- function(start, stop) {
  if (start > stop) return(NULL)
  start:stop
}


Après, on pourrait se poser la question de pourquoi entrer dans une boucle (for/while avec ou sans next/break) ou tenter d'entrer dans une boucle en premier lieu ?

edit:

Code : Tout sélectionner

set.seed(20210511)
invisible(sapply(1:5, function(i) {
  message(sprintf("I=%d", i))
  start <- sample(1:10, 1)
  stop <- sample(1:10, 1)
  if (stop < start) for (i in start:stop) cat(i, sep = "\n")
}))
#> I=1
#> I=2
#> 10
#> 9
#> I=3
#> I=4
#> I=5
#> 6
#> 5      

Au passage:

Code : Tout sélectionner

cat(1:3, "\n")
#> 1 2 3
cat(1, "\n")
#> 1  

est différent de

Code : Tout sélectionner

cat(1:3, sep = "\n")
#> 1
#> 2
#> 3
cat(1, sep = "\n")
#> 1  
Mickaël
mickael.canouil.fr | rlille.fr

Eric Wajnberg
Messages : 778
Enregistré le : 11 Aoû 2008, 15:37
Contact :

Re: boucle for comme en C

Messagepar Eric Wajnberg » 11 Mai 2021, 16:41

Oui.

Tout ceci - et plein d'autres possibilités encore - revient à ce que je disais initialement :
Eric Wajnberg a écrit :Je peux évidement - et facilement - rajouter des lignes de code pour bloquer les tours de boucle si nécessaire.

Encore merci, Eric.

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: boucle for comme en C

Messagepar Logez Maxime » 11 Mai 2021, 20:01

Bonjour,

oui tu as plein de possibilité tu peux aussi ajouter un if else dans le for :

Code : Tout sélectionner

a <- 3
b <- 1
for (i in if (a>b) NULL else a:b) cat(i, "\n")
Cordialement,
Maxime

Eric Wajnberg
Messages : 778
Enregistré le : 11 Aoû 2008, 15:37
Contact :

Re: boucle for comme en C

Messagepar Eric Wajnberg » 14 Mai 2021, 05:41

Logez Maxime a écrit :

Code : Tout sélectionner

a <- 3
b <- 1
for (i in if (a>b) NULL else a:b) cat(i, "\n")

Merci. C'est la solution la plus élégante de toutes celles proposées ici, je trouve.

Eric.


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité

cron