Пайп %>% — цепочки операций

Главный приём современного R — пайп %>%, который превращает вложенные вызовы в читаемую цепочку.

Пайп (%>%) — оператор, передающий результат слева в первый аргумент функции справа.

Без пайпа сложный анализ превращается в матрёшку из вложенных вызовов, которую читать приходится изнутри наружу. Пайп переворачивает запись: операции идут слева направо, как шаги рецепта.

Почему это так важно? Реальный анализ — это почти всегда цепочка из 4–7 шагов: отфильтровать, добавить колонку, сгруппировать, посчитать сводку, отсортировать, взять верхушку. Записанная вложенными вызовами, такая цепочка нечитаема и легко ломается при правке. Пайп делает каждый шаг отдельной строкой, которую можно закомментировать, переставить или вставить новую посередине. Этот приём настолько удобен, что определяет весь современный стиль кода в R — без него tidyverse не существовал бы.

Проблема вложенности

Допустим, нужно отфильтровать, отсортировать и взять первые строки. Без пайпа:

head(arrange(filter(people, age > 18), desc(age)), 3)

Читается изнутри: сначала filter, потом arrange, потом head — но в коде порядок обратный. Легко запутаться.

Тот же код с пайпом

Пайп %>% берёт левый результат и подставляет его первым аргументом справа:

library(dplyr)
result <- people %>%
  filter(age > 18) %>%
  arrange(desc(age)) %>%
  head(3)

Теперь читается сверху вниз, по-человечески: «возьми people, отфильтруй, отсортируй, возьми первые 3». Функции dplyr специально устроены так, что таблица — их первый аргумент, поэтому пайп ложится идеально.

Как читать пайп

Удобно мысленно проговаривать %>% как слово «затем»:

people %>% filter(...) %>% summarise(...)
   |          |              |
  данные   затем фильтр   затем сводка

Как работает под капотом

Запись x %>% f(y) R преобразует в обычный вызов f(x, y) — левый операнд просто вставляется первым аргументом. Никакой магии: пайп — это синтаксический сахар, эквивалентный вложенному вызову, но читаемый. В современных версиях R (4.1+) появился встроенный пайп |> с похожим поведением, но в tidyverse исторически используют %>% из пакета magrittr, у него больше возможностей.

Частые ошибки

  • Забыть подключить dplyr/magrittr. Оператор %>% приходит из пакета — без library(dplyr) его нет.
  • Ставить пайп в конце разрыва не там. При переносе строки %>% должен стоять в конце строки, а не в начале следующей.
  • Пытаться пайпить в функцию, где данные не первый аргумент. Тогда нужен placeholder-точка, но в dplyr это редкость.

Итог

  • Пайп %>% передаёт левый результат первым аргументом вправо.
  • Превращает вложенные вызовы в читаемую цепочку «затем».
  • x %>% f(y) эквивалентно f(x, y).
  • Приходит из пакета (magrittr/dplyr), требует library.
Проверьте себя
1. Что делает оператор %>% в R?
AДелит числа
BПередаёт левый результат первым аргументом в функцию справа
CСравнивает значения
DСоздаёт вектор
2. Чему эквивалентна запись x %>% f(y)?
Af(y, x)
Bf(x, y)
Cx(f, y)
Dy %>% f(x)
3. Откуда берётся оператор %>% в коде с dplyr?
AЭто часть базового R с самого начала
BИз пакета (magrittr/dplyr), нужен library
CИз RStudio
DИз CSV-файла