Я видел использование функции %>%
(процентов больше, чем процентов) в некоторых пакетах, таких как dplyr и rvest. Что это значит? Это способ написать блоки замыкания в R?
Что означает функция%>% в R?
Ответ 1
%...% операторов
%>%
не имеет встроенного значения, но пользователь (или пакет) может свободно определять операторы формы %whatever%
от того, %whatever%
им нравится. Например, эта функция вернет строку, состоящую из ее левого аргумента, за которым следуют запятая и пробел, а затем - правого аргумента.
"%,%" <- function(x, y) paste0(x, ", ", y)
# test run
"Hello" %,% "World"
## [1] "Hello, World"
Основание R обеспечивает %*%
(матричное умножение), %/%
(целочисленное деление), %in%
(является ли lhs компонентом rhs?), %o%
(внешний продукт) и %x%
(продукт Кронекера), Не ясно, попадает ли %%
в эту категорию или нет, но он представляет по модулю.
expm Пакет R, expm, определяет матричный оператор степени %^%
. Для примера см. Матричная мощность в R.
операторы В пакете операторов R определено большое количество таких операторов, таких как %!in%
(не %in%
). См. Http://cran.r-project.org/web/packages/operators/operators.pdf.
трубы
magrittr В случае %>%
пакет magrittr R определил его, как обсуждалось в виньетке magrittr. См. Http://cran.r-project.org/web/packages/magrittr/vignettes/magrittr.html.
magittr также определил ряд других таких операторов. См. Раздел "Дополнительные операторы конвейера" предыдущей ссылки, в котором обсуждаются %T>%
, %<>%
и %$%
и http://cran.r-project.org/web/packages/magrittr/magrittr.pdf для получения дополнительной информации. подробности.
dplyr Пакет dplyr R, используемый для определения оператора %.%
который похож; однако он устарел, и теперь dplyr рекомендует пользователям использовать %>%
который dplyr импортирует из magrittr и делает доступным для пользователя dplyr. Как упоминал Дэвид Аренбург в комментариях, в этом вопросе SO обсуждаются различия между ним и magrittr %>%
: различия между%.% (Dplyr) и%>% (magrittr)
pipeR Пакет R, pipeR, определяет оператор %>>%
который похож на magrittr%>% и может использоваться в качестве альтернативы ему. Смотрите http://renkun.me/pipeR-tutorial/
Пакет pipeR также определил ряд других таких операторов. Смотрите: http://cran.r-project.org/web/packages/pipeR/pipeR.pdf
postlogic Пакет postlogic определяет %if%
и %unless%
операторов.
wrapr Пакет R, wrapr, определяет точечный канал %.>%
который является явной версией %>%
в том смысле, что он не выполняет неявную вставку аргументов, а только заменяет явное использование точки справа. Это можно рассматривать как другую альтернативу %>%
. См. Https://winvector.github.io/wrapr/articles/dot_pipe.html.
Бизарро труба. Это на самом деле не труба, а какой-то умный базовый синтаксис, чтобы работать аналогично каналам без фактического использования каналов. Это обсуждается в http://www.win-vector.com/blog/2017/01/using-the-bizarro-pipe-to-debug-magrittr-pipelines-in-r/ Идея состоит в том, что вместо написания:
1:8 %>% sum %>% sqrt
## [1] 6
один пишет следующее. В этом случае мы явно используем точку вместо удаления аргумента точки и заканчиваем каждый компонент конвейера присваиванием переменной, имя которой является точкой (.
). Мы следуем этому с точкой с запятой.
1:8 ->.; sum(.) ->.; sqrt(.)
## [1] 6
Обновление Добавлена информация о пакете expm и упрощенный пример вверху. Добавлен постлогический пакет.
Ответ 2
Мое понимание после прочтения ссылки предложенной G.Grothendieck, состоит в том, что% > % - это оператор, который выполняет функции труб, чтобы улучшить удобочитаемость и производительность, так как легче следить за потоком нескольких функций через эти каналы, чем идти назад, когда несколько функций вложены.
Ответ 3
%>%
похож на трубу в Unix. Например, в
a <- combined_data_set %>% group_by(Outlet_Identifier) %>% tally()
выход combined_data_set
войдет в group_by
и его выход будет в tally
, то конечный результат присваивается. a
Это дает вам удобный и простой способ последовательного использования функций без создания переменных и хранения промежуточных значений.
Ответ 4
R-пакеты dplyr и sf импортируют оператор%>% из R-пакета magrittr.
Справка доступна с помощью следующей команды:
?'%>%'
Конечно, пакет должен быть загружен перед использованием, например,
library(sf)
Документация оператора прямого канала magrittr дает хороший пример: когда функциям требуется только один аргумент, x%>% f эквивалентно f (x)
Ответ 5
Канал %>%
пропускает выходные данные фрейма данных, полученные из функции непосредственно перед каналом, и вводит их в качестве первого аргумента функции сразу после канала.