map() et ses variantes typées
Appliquez des fonctions à des listes avec map(), map_dbl(), map_chr() et map_lgl().
map() et ses variantes typées est une leçon R Academy gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage R Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours R Academy comprend 4 leçons au total.
Programmation fonctionnelle avec purrr
Le paquet purrr fournit des outils cohérents et sûrs du point de vue des types pour la programmation fonctionnelle en R. Au lieu d'écrire des boucles for, vous appliquez une fonction à une liste ou à un vecteur. Le code obtenu est plus clair, plus facile à comprendre et à composer.
library(purrr)
# A list of numbers
numbers <- list(1, 4, 9, 16, 25)
# Apply sqrt() to each element
result <- map(numbers, sqrt)
print(result)map() — Renvoie toujours une liste
map(.x, .f) applique la fonction .f à chaque élément de .x et renvoie une liste. L'entrée peut être une liste, un vecteur ou une trame de données (l'itération s'effectue alors sur les colonnes). Il s'agit de la variante map la plus générale.
library(purrr)
# Map over a character vector
fruits <- c('apple', 'banana', 'cherry')
# nchar() counts characters in each string
result <- map(fruits, nchar)
print(result) # Returns a list
print(class(result))map_dbl() — Renvoie un vecteur numérique
map_dbl(.x, .f) applique .f à .x et renvoie un vecteur numérique (double). Si un résultat n'est pas une valeur numérique unique, la fonction renvoie une erreur — cette vérification de type permet de détecter rapidement les bogues.
library(purrr)
groups <- list(
A = c(10, 20, 30),
B = c(5, 15, 25, 35),
C = c(100, 200)
)
# Compute mean for each group — returns a named numeric vector
means <- map_dbl(groups, mean)
print(means)
print(class(means))map_chr() — Renvoie un vecteur de caractères
map_chr(.x, .f) applique une fonction et renvoie un vecteur de caractères. Cette fonction est utile pour extraire des attributs textuels, mettre en forme des résultats ou construire des chemins de fichiers. La fonction doit renvoyer une seule chaîne par élément.
library(purrr)
models <- list(
m1 = lm(mpg ~ wt, data=mtcars),
m2 = lm(mpg ~ hp, data=mtcars),
m3 = lm(mpg ~ cyl, data=mtcars)
)
# Extract the formula from each model as a string
map_chr(models, function(m) deparse(formula(m)))map_lgl() — Renvoie un vecteur logique
map_lgl(.x, .f) renvoie un vecteur logique composé de valeurs TRUE/FALSE. Cette fonction est idéale pour tester des conditions sur une liste — par exemple, pour vérifier quels éléments répondent à un critère.
library(purrr)
datasets <- list(
df1 = data.frame(x=1:3, y=c(NA,2,3)),
df2 = data.frame(x=1:3, y=4:6),
df3 = data.frame(x=c(NA,NA,3), y=1:3)
)
# Does each data frame contain any NA values?
map_lgl(datasets, function(df) anyNA(df))map_int() — Renvoie un vecteur d'entiers
map_int(.x, .f) renvoie un vecteur d'entiers. Utilisez-le lorsque votre fonction renvoie des comptages, des indices ou d'autres résultats exprimés en nombres entiers. Remarque : dans R, length() et nrow() renvoient des entiers.
library(purrr)
my_lists <- list(
a = 1:10,
b = letters[1:5],
c = c(TRUE, FALSE, TRUE, TRUE)
)
# Count elements in each list item
map_int(my_lists, length)map_df() / map_dfr() — Renvoie un cadre de données
map_df(.x, .f) (alias : map_dfr()) applique .f et empile les résultats par lignes dans un seul cadre de données. La fonction doit renvoyer un cadre de données ou un tibble pour chaque élément. map_dfc() empile les résultats par colonnes.
library(purrr)
files <- c('sales_q1', 'sales_q2', 'sales_q3')
# Simulate reading and labeling each file
map_df(files, function(f) {
data.frame(
file = f,
rows = sample(50:100, 1),
cols = 5
)
})Fonctions anonymes avec ~
purrr prend en charge une notation abrégée sous forme de formule pour les fonctions anonymes : ~expr, où .x désigne l’élément courant. Cela évite d’écrire function(x) expr et permet de garder un code concis. Les deux styles fonctionnent de manière identique.
library(purrr)
numbers <- list(1, 4, 9, 16, 25)
# Three equivalent ways:
result1 <- map(numbers, function(x) x^2)
result2 <- map(numbers, ~.x^2)
result3 <- map_dbl(numbers, ~.x^2)
print(result2)
print(result3)Parcourir une liste nommée
Lorsque .x est une liste ou un vecteur nommé, la sortie de map() conserve ces noms. map_dbl() et les autres variantes typées conservent également les noms, ce qui rend les résultats explicites.
library(purrr)
region_data <- list(
East = c(100, 120, 115, 130),
West = c(200, 195, 210, 205),
North = c(80, 85, 90, 88)
)
# Named results
map_dbl(region_data, mean)Utiliser map() avec les colonnes d’un cadre de données
Un cadre de données est une liste de colonnes. map(df, fn) applique fn à chaque colonne. Associée à map_dbl(), cette fonction offre un moyen concis de calculer une statistique pour toutes les colonnes à la fois.
library(purrr)
df <- data.frame(
score_a = c(85, 90, 78, 92),
score_b = c(88, 85, 80, 95),
score_c = c(92, 88, 84, 90)
)
# Mean of every column
map_dbl(df, mean)Imbriquer des appels à map()
Vous pouvez imbriquer des appels à map() pour effectuer des itérations à plusieurs niveaux — la map externe parcourt les groupes et la map interne parcourt les paramètres. Cela remplace les boucles for imbriquées par une structure claire et composable. Pour conserver une bonne lisibilité, limitez l’imbrication à 2 niveaux.
library(purrr)
groups <- list(A = 1:5, B = 6:10)
functions <- list(mean=mean, sd=sd, min=min)
# Apply each function to each group
map(groups, function(g) {
map_dbl(functions, function(f) f(g))
})Vérification rapide
Quelle est la différence essentielle entre map() et map_dbl() ?
Récapitulatif : map() et variantes typées
Points essentiels concernant map() et les variantes typées :
map(.x, .f)— renvoie toujours une liste ; c’est la fonction la plus flexiblemap_dbl()— renvoie un vecteur numeric ; génère une erreur si le type est incorrectmap_chr()— renvoie un vecteur de chaînes de caractèresmap_lgl()— renvoie un vecteur logiquemap_int()— renvoie un vecteur d’entiersmap_df()/map_dfr()— empilent les résultats par lignes dans un cadre de données- Notation abrégée
~.x— syntaxe concise pour une fonction anonyme - Les entrées nommées produisent automatiquement des sorties nommées
library(purrr)
# Typed map showcase
data_list <- list(
group_A = c(10, 20, 30),
group_B = c(5, 15),
group_C = c(100, 200, 300, 400)
)
cat('Counts:', map_int(data_list, length), '\n')
cat('Means: ', map_dbl(data_list, mean), '\n')
cat('Any>50:', map_lgl(data_list, ~any(.x > 50)), '\n')Questions Fréquemment Posées
La leçon « map() et ses variantes typées » est-elle gratuite ?
Oui — le texte complet de « map() et ses variantes typées » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours R Academy, passe à CoddyKit PRO. Le cours R Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « map() et ses variantes typées » ?
Appliquez des fonctions à des listes avec map(), map_dbl(), map_chr() et map_lgl(). Tu pratiques R Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer R Academy ?
Aucune expérience préalable n'est requise. R Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.
Combien de temps prend la leçon « map() et ses variantes typées » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon R Academy ?
Oui. Chaque leçon R Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- map() et ses variantes typées
- map2() et pmap() pour plusieurs entrées
- reduce(), accumulate() et walk()
- keep(), discard() et filtrage de listes