Quand je fais mon cours d'initiation R aux petits Padawans de l'année, j'ai toujours un peu de difficultés à leur montrer l'intérêt du pipe (%>%
) au moment où je leur montre les fonctions de dplyr
. C'est toujours un moment où je m'anime, où je fais des grands gestes pour montrer comment on pousse le résultat d'une commande à travers un "tuyau" pour qu'elle atterrise dans une deuxième commande, où je gesticule dans l'espoir de convaincre mon auditoire somme toute dubitatif de la commodité de la chose.
Je me disais donc (comme souvent) que la chose qu'il me manquait vraiment pour expliquer l'intérêt des pipes, c'était un petit dessin... J'ai sauté le pas et voici donc le résultat:
L'idée, c'est d'expliquer les différentes manières d'enchaîner des commandes en prenant pour exemple la confection d'une omelette à la ciboulette. En effet, pour faire cette omelette, il faut s'acquitter de trois tâches successives:
- casser les oeufs et y ajouter sel et poivre
- battre ensemble les blancs et les jaunes
- cuire le tout à la poêle et parsemer de ciboulette ciselée
Quand on débute en R, la façon classique dont on pourrait (métaphoriquement) confectionner une omelette à la ciboulette, ce serait d'enchaîner ces trois étapes en réservant à chaque fois le résultat dans un récipient (= en attribuant le résultat à un objet).
En R, ça donne ça:
white_and_yolk <- crack(egg, add_seasoning)
omelette_batter <- beat(white_and_yolk)
omelette_with_chives <- cook(omelette_batter,add_chives)
En cuisine, ça donne ça:
Pas de souci, on a bien fait le job! Par contre, on a sali de la vaisselle/on a dû créer des objets intermédiaires.
De fait, si on veut éviter de salir de la vaisselle, on peut "cuire l'oeuf battu issu du blanc et du jaune issu de l'oeuf cassé". C'est-à-dire faire l'omelette en une seule ligne de commande.
En R, ça donne ça:
omelette_with_chives <- cook(beat(crack(egg, add_seasoning)),add_chives)
En cuisine, ça donne ça:
Cette fois-ci, le souci, ce n'est pas la vaisselle salie, mais la confusion!... La rédaction et la relecture des instructions est en effet malcommode du fait que l'on lit les instructions dans l'ordre inverse de leur réalisation
Le fait d'utiliser des "pipes" (tuyaux, en anglais) va nous permettre d'éviter ces deux écueils en évitant la création d'objets intermédiaires tout en permettant des respecter l'ordre naturel des instructions...
En R:
egg %>%
crack(add_seasoning) %>%
beat() %>%
cook(add_chives) -> omelette_with_chives
En cuisine:
On fait passer le résultat de chaque opération à l'opération suivante via un tuyau... Trop fastoche, l'omelette à la ciboulette.
Et bon appétit bien sûr!
8 Comments
Maëlle
Formidable, bravo ! 😀
À quand des versions dessins animés de tes articles ? :o)
lvaudor
Merci! Haha, je n'avais pas pensé à animer tout ça mais c'est vrai que pour celui-là en particulier, ça s'y prêterait bien!!
Sébastien Boutry
Bravo pour cet article
lvaudor
Merci!
Marie
Très parlant, merci !
Sacha Muszlak
Illustration très sympa du principe des pipes. Et bien sûr, j'aime bien aussi l'humour qui abouti à ce que le package permettant les pipes s'appelle MagrittR...
lvaudor
Merci 🙂
vandeputte
Tout d'abord, un grand merci pour ce blog très sympa et très drôle,
je suis jean christophe Vandeputte de l'insee de lille, je me passionne "en amateur" pour R et je m'intéresse surtout à votre blog sur les graphes non orientés, le fichier relationships...
mais j'avoue que comme débutant en R je bute sur l'entrée des données dans la machine
cad lire un csv puis découper le fichier etc
si vous pouviez me détailler les opérations qui vous semblent "faciles"
Pour ma part, je souhaiterais faire du text mining par exemple passer d'une liste de duos de mots présents dans un texte long à un graphe non orienté afin d'illustrer si possible les différentes relations entre les mots présents pour en faire une synthèse visuelle.
cordialement,
jc vandeputte