# 500 lignes de code dans un seul fichier...
<- read.csv("data.csv")
donnees $nom <- tolower(donnees$nom)
donnees# ... 50 lignes de nettoyage ...
<- mean(donnees$valeur1, na.rm = TRUE)
moyenne1 # ... 30 lignes de calculs ...
ggplot(donnees, aes(x = var1, y = var2)) + geom_point()
# ... encore 400 lignes ...
Séance 6 : Organisation et modularité
Apprendre R avec les LLMs
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
- 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 :
- Difficile à lire
- Difficile à maintenir
- Impossible à réutiliser
- Difficile à débugger
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 :
<- read.csv("ventes.csv")
d $nom <- tolower(d$nom)
d$date <- as.Date(d$date)
d<- mean(d$montant, na.rm = TRUE)
m print(paste("Moyenne:", m))
<- d[d$montant > m, ]
d2 plot(d2$date, d2$montant)
<- sum(d$montant, na.rm = TRUE)
s print(paste("Total:", s))
<- d[d$categorie == "A", ]
d3 <- mean(d3$montant, na.rm = TRUE) m2
Demandez au LLM :
“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
- Un fichier = une responsabilité
01_import_donnees.R
02_nettoyage.R
03_fonctions_analyse.R
04_visualisation.R
- Des noms explicites
calculer_moyenne_par_groupe()
✅calc()
❌
- Des fonctions courtes
- Une fonction = une tâche
- 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 :
<- function(data) {
nettoyer_noms $nom <- tolower(data$nom)
datareturn(data)
}
<- function(data, colonne_date) {
convertir_dates <- as.Date(data[[colonne_date]])
data[[colonne_date]] return(data)
}
Étape 2 - Fonctions d’analyse :
<- function(data, colonne) {
calculer_statistiques 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
<- read.csv("donnees/ventes.csv")
donnees <- nettoyer_noms(donnees)
donnees <- calculer_statistiques(donnees, "montant") stats
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
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éestidyr
: restructuration de donnéeslubridate
: dates et heures
Installer et charger un package
Installation (une seule fois) :
install.packages("dplyr")
Chargement (à chaque session) :
library(dplyr)
install.packages()
: télécharge depuis internet library()
: active pour utilisation
Exercice 4 : Découvrir dplyr
dplyr simplifie la manipulation de données
Demandez au LLM :
“Explique-moi les principales fonctions de dplyr en R avec des exemples simples”
Fonctions principales :
filter()
: filtrer les lignesselect()
: sélectionner les colonnesmutate()
: créer/modifier des colonnessummarise()
: calculer des résumésgroup_by()
: grouper par catégoriearrange()
: trier les lignes
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)
<- arrange(
resultat summarise(
group_by(
filter(donnees, age > 18),
categorie
),moyenne = mean(valeur)
),
moyenne
)
# Avec le pipe (facile à lire)
<- donnees %>%
resultat 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)
<- "2023-01-15"
date <- ymd(date)
d year(d) # Extraire l'année
month(d) # Extraire le mois
wday(d, label = TRUE) # Jour de la semaine
stringr (texte) :
library(stringr)
<- " Bonjour "
texte 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 !
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)
# Erreur: could not find function "%>%"
# Problème 2
library(dplyr)
select(iris, Species, Sepal.Length)
# Marche, mais warning sur conflit avec MASS
# Problème 3
install.packages("monpackageinexistant")
# Erreur: package not found
Demandez au LLM de vous aider à comprendre et résoudre chaque erreur.
15 minutes. Exercice de debugging.
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
::filter(donnees, age > 18)
dplyr::filter(serie_temporelle, filtre) stats
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
<- function(data, colonne) {
standardiser_noms <- tolower(data[[colonne]])
data[[colonne]] return(data)
}
#' Supprimer les lignes avec NA
<- function(data, colonnes = NULL) {
supprimer_na if (is.null(colonnes)) {
return(na.omit(data))
}complete.cases(data[, colonnes]), ]
data[ }
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")
<- function(parametre1, parametre2) {
ma_fonction # 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
<- read.csv("data.csv")
donnees <- standardiser_noms(donnees, "nom")
donnees <- supprimer_na(donnees, c("age", "salaire"))
donnees
<- calculer_statistiques_complete(donnees)
stats plot_distribution(donnees, "salaire")
Testez que tout fonctionne !
20 minutes. Test d’intégration.
Retour réflexif
Exercice réflexif : Journal de bord
Documentez :
- Refactoring :
- Avant/après : montrez un exemple de code que vous avez amélioré
- Qu’est-ce qui rend le code “après” meilleur ?
- Packages :
- Les 3 packages découverts aujourd’hui
- Fonction la plus utile de chaque package
- Une erreur de package que vous avez résolue
- 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
- Réorganisez un de vos anciens projets avec la structure modulaire
- Créez au moins 5 fonctions documentées dans votre bibliothèque
- Pratiquez dplyr avec vos propres données
- 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 ?
- 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 ! 📚