# Version imbriquée (difficile à lire)
summarise(select(filter(iris, Species == "setosa"), Sepal.Length, Sepal.Width),
mean_length = mean(Sepal.Length))
# Ou avec variables intermédiaires (verbose)
iris_filtered <- filter(iris, Species == "setosa")
iris_selected <- select(iris_filtered, Sepal.Length, Sepal.Width)
summarise(iris_selected, mean_length = mean(Sepal.Length))Ce pipe n’est pas un pipe
|> et %>%.
R, pipe, tidyverse, magrittr, RStudio
Ce pipe n’est pas un pipe
“Ceci n’est pas une pipe” – René Magritte (1929)
Si vous programmez en R, vous connaissez sûrement le pipe : cet opérateur magique qui permet de chaîner les opérations de manière lisible. Mais saviez-vous qu’il en existe deux versions ? Et qu’elles ne sont pas tout à fait identiques ?
Petit tour d’horizon de %>% (le pipe historique du tidyverse) et |> (le pipe natif de R) et de leurs différences.
Le pipe, c’est quoi ?
Le pipe est un opérateur qui permet de chaîner les opérations de manière lisible. Au lieu d’imbriquer les fonctions ou de créer des variables intermédiaires, on “fait passer” le résultat d’une fonction à la suivante.
Sans pipe :
Avec pipe :
iris %>%
filter(Species == "setosa") %>%
select(Sepal.Length, Sepal.Width) %>%
summarise(mean_length = mean(Sepal.Length))C’est plus lisible : on lit le code de haut en bas, comme une recette de cuisine. Chaque ligne décrit une étape du traitement.
Les deux pipes en action
Le pipe magrittr : %>%
Introduit par le package magrittr et popularisé par le tidyverse, %>% est LE pipe historique. Il a révolutionné la façon d’écrire du code R en rendant les pipelines de traitement parfaitement lisibles :
library(dplyr)
iris %>%
filter(Species == "setosa") %>%
select(Sepal.Length, Sepal.Width) %>%
summarise(mean_length = mean(Sepal.Length))Le pipe natif : |>
Depuis R 4.1.0 (mai 2021), R dispose de son propre pipe natif : |>. Plus besoin d’installer magrittr pour l’utiliser !
iris |>
filter(Species == "setosa") |>
select(Sepal.Length, Sepal.Width) |>
summarise(mean_length = mean(Sepal.Length))Quelle est la différence ?
Les deux pipes font presque la même chose : ils prennent le résultat de l’expression à gauche et le passent comme premier argument de la fonction à droite. Voici les différences principales.
1. Le placeholder .
Le pipe magrittr permet d’utiliser un placeholder . pour contrôler où passe l’objet :
# Avec %>% : on peut placer l'objet ailleurs que comme premier argument
iris %>%
lm(Sepal.Length ~ Sepal.Width, data = .)Le pipe natif |> ne supporte pas directement cette syntaxe, mais deux solutions s’offrent à vous.
Option 1 : utiliser le placeholder _ (R ≥ 4.2.0)
# Avec |> (R ≥ 4.2.0) : placeholder _
iris |>
lm(Sepal.Length ~ Sepal.Width, data = _)_
Le placeholder _ ne fonctionne que :
- dans les arguments nommés (pas dans les arguments positionnels) ;
- une seule fois par expression.
Exemples qui ne fonctionnent pas :
iris |> head(_) # argument positionnel
iris |> plot(x = _, y = _) # plusieurs placeholdersPour plus de flexibilité, utilisez une fonction anonyme.
Option 2 : utiliser une fonction anonyme (R ≥ 4.1.0)
# Avec |> : fonction anonyme
iris |>
(\(x) lm(Sepal.Length ~ Sepal.Width, data = x))()Une fonction anonyme est une fonction sans nom, créée “à la volée”. En R, la syntaxe \(x) (ou function(x)) crée une fonction qui prend x comme argument.
# Sans pipe : fonction classique
ma_fonction : fonction anonyme
5 |> (\(x) x * 2)() # retourne aussi 10Les () à la fin exécutent immédiatement la fonction créée.
2. Compatibilité
%>%fonctionne sur toutes les versions de R (si vous chargezmagrittr)|>nécessite R ≥ 4.1.0
Si vous partagez du code avec des personnes utilisant des versions anciennes de R, privilégiez %>%.
Alors, lequel choisir ?
Utilisez |> si vous travaillez en R ≥ 4.1.0 et n’avez pas besoin du placeholder ..
Utilisez %>% si vous avez besoin du placeholder . ou travaillez avec des versions anciennes de R.
Débutant ? Utilisez |>. Déjà habitué à %>% ? Gardez-le, ça marche très bien.
Depuis RStudio 2022.07, Ctrl + Shift + M insère |> par défaut. Pour revenir à %>% : Tools > Global Options > Code puis décochez “Use native pipe operator”.
Envie d’approfondir R ? Découvrez mes formations pour maîtriser le tidyverse, la visualisation et le machine learning.