Séance 6 : Organisation et modularité

Apprendre R avec les LLMs

Auteur·rice

Elias Bouacida

Date de publication

3 décembre 2025

Plan de la séance

  • Récap et partage (15min) : Retours sur les projets
  • Refactoring collectif (45min) : Organiser un long script
  • Packages et écosystème R (60min) : dplyr, lubridate, stringr
  • Gestion des erreurs courantes (45min) : Packages manquants, conflits
  • Mini-package personnel (50min) : Organiser ses fonctions

Production attendue : Code organisé en modules + maîtrise de 3 packages

Objectifs de la séance

AstuceStructurer son code comme un professionnel
  • Organiser son code en modules logiques
  • Découvrir l’écosystème des packages R
  • Maîtriser dplyr pour manipuler les données
  • Gérer les erreurs liées aux packages
  • Créer sa propre bibliothèque de fonctions

Récap et partage

Retours sur vos projets

  • Quels retours avez-vous reçus ?
  • Qu’avez-vous amélioré dans votre projet ?
  • Une difficulté commune que vous avez observée ?

Le problème du code “spaghetti”

Observez ce type de code :

# 500 lignes de code dans un seul fichier...
donnees <- read.csv("data.csv")
donnees$nom <- tolower(donnees$nom)
# ... 50 lignes de nettoyage ...
moyenne1 <- mean(donnees$valeur1, na.rm = TRUE)
# ... 30 lignes de calculs ...
ggplot(donnees, aes(x = var1, y = var2)) + geom_point()
# ... encore 400 lignes ...
AvertissementProblèmes
  • Difficile à lire
  • Difficile à maintenir
  • Impossible à réutiliser
  • Difficile à déboguer

Refactoring collectif

Qu’est-ce que le refactoring ?

Refactoring = Réorganiser le code sans changer son comportement

Objectifs :

  • Améliorer la lisibilité
  • Faciliter la réutilisation
  • Simplifier la maintenance
  • Réduire la duplication

Exercice 1 : Analyser du code désordonné

Voici un script à améliorer :

d <- read.csv("ventes.csv")
d$nom <- tolower(d$nom)
d$date <- as.Date(d$date)
m <- mean(d$montant, na.rm = TRUE)
print(paste("Moyenne :", m))
d2 <- d[d$montant > m, ]
plot(d2$date, d2$montant)
s <- sum(d$montant, na.rm = TRUE)
print(paste("Total :", s))
d3 <- d[d$categorie == "A", ]
m2 <- mean(d3$montant, na.rm = TRUE)

Quels sont les problèmes de ce code ? Comment pourrait-on l’améliorer ?

15 minutes. Discussion collective sur les problèmes.

Principes d’organisation

  1. Un fichier = une responsabilité
    • 01_import_donnees.R
    • 02_nettoyage.R
    • 03_fonctions_analyse.R
    • 04_visualisation.R
  2. Des noms explicites
    • calculer_moyenne_par_groupe()
    • calc()
  3. Des fonctions courtes
    • Une fonction = une tâche
  4. Des commentaires utiles
    • Expliquer le “pourquoi”, pas le “quoi”

Exercice 2 : Refactoring guidé

Transformons le code précédent ensemble :

Étape 1 - Fonctions de nettoyage :

nettoyer_noms <- function(data) {
  data$nom <- tolower(data$nom)
  return(data)
}

convertir_dates <- function(data, colonne_date) {
  data[[colonne_date]] <- as.Date(data[[colonne_date]])
  return(data)
}

Étape 2 - Fonctions d’analyse :

calculer_statistiques <- function(data, colonne) {
  list(
    moyenne = mean(data[[colonne]], na.rm = TRUE),
    total = sum(data[[colonne]], na.rm = TRUE),
    n = length(data[[colonne]])
  )
}

20 minutes. Refactoring collectif guidé.

Exercice 3 : Organisation en modules

Créez la structure suivante :

mon_projet/
├── donnees/
│   └── ventes.csv
├── scripts/
│   ├── 01_fonctions_nettoyage.R
│   ├── 02_fonctions_analyse.R
│   └── 03_fonctions_visualisation.R
└── analyse_principale.R

Dans analyse_principale.R :

# Charger les fonctions
source("scripts/01_fonctions_nettoyage.R")
source("scripts/02_fonctions_analyse.R")
source("scripts/03_fonctions_visualisation.R")

# Utiliser les fonctions
donnees <- read.csv("donnees/ventes.csv")
donnees <- nettoyer_noms(donnees)
stats <- calculer_statistiques(donnees, "montant")

20 minutes. Les étudiants créent leur première structure modulaire.

Packages et écosystème R

Qu’est-ce qu’un package?

Un package = Collection de fonctions réutilisables

aka : paquet ou Librairie

Avantages :

  • Fonctions testées et documentées
  • Gain de temps énorme
  • Communauté active
  • Standards professionnels

Exemples célèbres :

  • ggplot2 : graphiques (vous connaissez déjà !)
  • dplyr : manipulation de données
  • tidyr : restructuration de données
  • lubridate : dates et heures

Installer et charger un package

Installation (une seule fois) :

install.packages("dplyr")

Chargement (à chaque session) :

library(dplyr)
NoteImportant

install.packages() : télécharge depuis internet (les dépôts du CRAN) library() : active pour utilisation

Exercice 4 : Découvrir dplyr

dplyr simplifie la manipulation de données

Utilisez la commande suivante dans votre console R

vignette("dplyr")

Quels sont les principales fonctions de dplyr

Fonctions principales :

  • filter() : filtrer les lignes
  • select() : sélectionner les colonnes
  • mutate() : créer/modifier des colonnes
  • summarise() : calculer des résumés
  • group_by() : grouper par catégorie
  • arrange() : trier les lignes
  • %>% : Combiner les fonctions

Testez avec vos données !

20 minutes. Première découverte de dplyr.

Le pipe %>% (ou |>)

dplyr introduit le pipe pour chaîner les opérations :

# Ancienne méthode (difficile à lire)
resultat <- arrange(
  summarise(
    group_by(
      filter(donnees, age > 18),
      categorie
    ),
    moyenne = mean(valeur)
  ),
  moyenne
)

# Avec le pipe (facile à lire)
resultat <- donnees %>%
  filter(age > 18) %>%
  group_by(categorie) %>%
  summarise(moyenne = mean(valeur)) %>%
  arrange(moyenne)

Le pipe se lit comme : “puis”

Exercice 5 : Pratiquer dplyr

Avec un dataset de ventes, utilisez dplyr pour :

library(dplyr)

ventes %>%
  filter(montant > 1000) %>%          # Garder montants > 1000
  select(vendeur, montant, date) %>%  # Sélectionner colonnes
  mutate(montant_ttc = montant * 1.2) %>%  # Ajouter TVA
  group_by(vendeur) %>%               # Grouper par vendeur
  summarise(
    total = sum(montant_ttc),
    moyenne = mean(montant_ttc),
    n_ventes = n()
  ) %>%
  arrange(desc(total))                # Trier par total décroissant

Demandez au LLM d’expliquer chaque ligne si besoin !

20 minutes. Exercice pratique avec dplyr.

Exercice 6 : Autres packages utiles

Découvrez d’autres packages :

lubridate (dates) :

library(lubridate)

date <- "2023-01-15"
d <- ymd(date)
year(d)   # Extraire l'année
month(d)  # Extraire le mois
wday(d, label = TRUE)  # Jour de la semaine

stringr (texte) :

library(stringr)

texte <- "  Bonjour  "
str_trim(texte)        # Enlever espaces
str_to_upper(texte)    # Majuscules
str_detect(texte, "Bon")  # Détecter motif

Demandez au LLM des exemples pour chaque package ou utilisez vignette()

20 minutes. Découverte d’autres packages utiles.

Gestion des erreurs

Erreurs courantes avec les packages

1. Package non installé :

Error: could not find function "filter"
→ Avez-vous fait install.packages("dplyr") ?

2. Package non chargé :

Error: could not find function "filter"
→ Avez-vous fait library(dplyr) ?

3. Conflits de noms :

filter() existe dans dplyr ET dans stats
→ Utiliser dplyr::filter() pour être explicite

4. Versions incompatibles :

Le package nécessite R version 4.0 minimum
→ Mettre à jour R

Exercice 7 : Debugging de packages

Corrigez ces erreurs volontaires :

# Problème 1
donnees %>%
  filter(age > 18)
# 
# Problème 2
library(dplyr)
select(iris, Species, Sepal.Length)

# Problème 3
install.packages(ggplot2)

Demandez au LLM de vous aider à comprendre et résoudre chaque erreur.

15 minutes. Exercice de débogage.
Problème 1 : Erreur : could not find function “%>%”
Problème 2 : Marche, mais warning sur conflit avec MASS
Problème 3 : Il faut mettre du texte et nom un nom d’objet.

Bonnes pratiques

Au début de chaque script :

# Charger les packages nécessaires
library(dplyr)
library(ggplot2)
library(lubridate)

# Vérifier la version R si besoin
if (getRversion() < "4.0.0") {
  stop("Ce script nécessite R version 4.0 ou supérieure")
}

En cas de conflit :

# Spécifier explicitement le package
dplyr::filter(donnees, age > 18)
stats::filter(serie_temporelle, filtre)

Mini-package personnel

Projet : Organiser vos fonctions

Objectif : Créer une bibliothèque personnelle de fonctions réutilisables

Structure :

ma_bibliotheque/
├── nettoyage.R
├── analyse.R
├── visualisation.R
└── utils.R

Exercice 8 : Créer sa bibliothèque

Dans nettoyage.R :

#' Standardiser les noms en minuscules
#' @param data Un dataframe
#' @param colonne Nom de la colonne à nettoyer
#' @return Le dataframe avec la colonne nettoyée
standardiser_noms <- function(data, colonne) {
  data[[colonne]] <- tolower(data[[colonne]])
  return(data)
}

#' Supprimer les lignes avec NA
supprimer_na <- function(data, colonnes = NULL) {
  if (is.null(colonnes)) {
    return(na.omit(data))
  }
  data[complete.cases(data[, colonnes]), ]
}

Créez au moins 3 fonctions dans chaque fichier !

30 minutes. Les étudiants organisent leurs fonctions.

Documentation des fonctions

Utilisez les commentaires roxygen2 :

#' Titre court de la fonction
#'
#' Description détaillée de ce que fait la fonction.
#'
#' @param parametre1 Description du premier paramètre
#' @param parametre2 Description du second paramètre
#' @return Description de ce que retourne la fonction
#' @examples
#' ma_fonction(donnees, "colonne")
ma_fonction <- function(parametre1, parametre2) {
  # Code ici
}

Demandez au LLM de vous aider à documenter vos fonctions !

Exercice 9 : Utiliser sa bibliothèque

Créez un script principal qui utilise votre bibliothèque :

# Charger toutes vos fonctions
source("ma_bibliotheque/nettoyage.R")
source("ma_bibliotheque/analyse.R")
source("ma_bibliotheque/visualisation.R")

# Utiliser vos fonctions
donnees <- read.csv("data.csv")
donnees <- standardiser_noms(donnees, "nom")
donnees <- supprimer_na(donnees, c("age", "salaire"))

stats <- calculer_statistiques_complete(donnees)
plot_distribution(donnees, "salaire")

Testez que tout fonctionne !

20 minutes. Test d’intégration.

Retour réflexif

Exercice réflexif : Journal de bord

Documentez :

  1. Refactoring :
    • Avant/après : montrez un exemple de code que vous avez amélioré
    • Qu’est-ce qui rend le code “après” meilleur ?
  2. Packages :
    • Les 3 packages découverts aujourd’hui
    • Fonction la plus utile de chaque package
    • Une erreur de package que vous avez résolue
  3. Organisation :
    • Structure de votre bibliothèque personnelle
    • Vos fonctions les plus réutilisables
    • Comment cette organisation vous aidera

15 minutes. Documentation des apprentissages.

Ce que vous avez appris

  • Organiser son code en modules logiques
  • Créer et documenter des fonctions réutilisables
  • Utiliser dplyr pour manipuler les données
  • Découvrir l’écosystème des packages R
  • Gérer les erreurs liées aux packages
  • Créer sa propre bibliothèque de fonctions
  • Adopter les bonnes pratiques professionnelles

Ressources et prochaines étapes

Packages clés découverts

dplyr :

  • filter(), select(), mutate(), summarise(), group_by()
  • Le pipe %>% (ou |>)

lubridate :

  • ymd(), year(), month(), wday()

stringr :

  • str_trim(), str_to_upper(), str_detect()

Pour aller plus loin

  • Explorez d’autres packages du tidyverse
  • Organisez vos anciens projets avec cette nouvelle structure
  • Documentez systématiquement vos fonctions
  • Partagez vos fonctions avec vos camarades

Préparation prochaine séance

NoteDevoirs
  1. Réorganisez un de vos anciens projets avec la structure modulaire
  2. Créez au moins 5 fonctions documentées dans votre bibliothèque
  3. Pratiquez dplyr avec vos propres données
  4. Mettez à jour votre journal avec tous les détails

Prochaine séance : Automatisation et rapports - traiter plusieurs fichiers et créer des rapports reproductibles !

Questions ?

AstucePoints clés à retenir
  • Le code organisé est plus facile à maintenir et réutiliser
  • Les packages vous font gagner un temps précieux
  • dplyr est essentiel pour manipuler des données
  • Documenter ses fonctions est une bonne pratique
  • La modularité est la clé du code professionnel

Bon courage pour l’organisation ! 📚