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!