Les boucles permettent d'exécuter un ensemble d'instructions de manière répétée. En R, comme dans la plupart des langages, on utilise principalement deux types de boucles :
* La boucle for : lorsque le nombre d'itérations est connu à l'avance.
* La boucle while : lorsque l'itération doit continuer tant qu'une condition reste vraie.
1. La boucle for#
La syntaxe d'une boucle for itère sur chaque élément d'un vecteur ou d'une séquence :
# Itérer sur les éléments d'un vecteur
prenoms <- c("Alice", "Bob", "Charlie")
for (p in prenoms) {
print(paste("Bonjour", p))
}
Sortie :
Itérer par les indices avec seq_along()#
Pour modifier un vecteur en place ou accéder à plusieurs variables en parallèle, on itère sur les indices numériques :
valeurs <- c(10, 20, 30, 40)
for (i in seq_along(valeurs)) {
print(paste("À l'indice", i, ", la valeur est", valeurs[i]))
}
[!TIP] Pourquoi préférer
seq_along(x)à1:length(x)?
Si votre vecteurxest vide (length(x) == 0), l'écriture1:length(x)va générer la séquence1:0(deux itérations indésirables qui provoquent un bug). La fonctionseq_along(x)gère parfaitement les vecteurs de longueur nulle sans générer d'erreur.
2. La boucle while#
La boucle while évalue sa condition avant chaque tour et s'arrête dès que la condition devient fausse :
# Exemple d'accumulation
solde <- 1000
interet <- 0.05
annee <- 0
while (solde < 1500) {
solde <- solde * (1 + interet)
annee <- annee + 1
}
print(paste("Objectif atteint en", annee, "ans avec un solde de", round(solde, 2), "€"))
Sortie :
3. Contrôle des boucles : break et next#
break: Interrompt immédiatement la boucle et passe à la suite du script.next: Saute directement à l'itération suivante sans exécuter le reste du bloc (équivalent decontinueen Python ou en C).
for (i in 1:10) {
# Sauter les nombres pairs
if (i %% 2 == 0) {
next
}
# Arrêter la boucle dès qu'on dépasse 7
if (i > 7) {
break
}
print(i) # Affichera 1, 3, 5, 7
}
4. La règle d'or en R : La pré-allocation de mémoire#
[!WARNING] Le piège fatal de la lenteur en R : Faire grandir un objet dynamiquement
BONNE PRATIQUE : Pré-allouer la taille finale à l'avance :
Dans beaucoup de langages, on a tendance à écrire :
Mieux encore : en R, cette opération s'écrit en une seule ligne vectorisée sans aucune boucle :
Mise en pratique#
- Écrivez une boucle
forqui calcule la factorielle d'un entier \(n = 6\) (\(6! = 6 \times 5 \times 4 \times 3 \times 2 \times 1\)). - À l'aide d'une boucle
while, simulez le lancer répété d'un dé à 6 faces (sample(1:6, 1)) et arrêtez-vous dès que vous obtenez le chiffre 6. Affichez le nombre de lancers nécessaires. - Soit un vecteur de 5 nombres aléatoires :
notes <- c(12, 8, 15, 6, 14). Écrivez une boucle qui affiche chaque note accompagnée de la mention"Admis"ou"Ajourné".
Commentaires