Ce pipe n’est pas un pipe

R bits
Sur les différences entre |> et %>%.
Auteur·rice

Thelma Panaïotis

Date de publication

27 janvier 2026

Mots clés

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 :

# 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))

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 = _)
AvertissementLimitations du placeholder _

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 placeholders

Pour 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))()
NoteQu’est-ce qu’une fonction anonyme ?

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 10

Les () à la fin exécutent immédiatement la fonction créée.

2. Compatibilité

  • %>% fonctionne sur toutes les versions de R (si vous chargez magrittr)
  • |> 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.