关于语法:R中%>%函数是什么意思?

What does %>% function mean in R?

我已经看到在某些软件包(例如dplyr和rvest)中使用了%>%(大于百分比)。 这是什么意思? 这是在R中编写闭包的方法吗?


%...%个运算符

%>%没有内在含义,但是用户(或程序包)可以随意定义%whatever%形式的运算符。例如,此函数将返回一个字符串,该字符串包含其左参数,逗号和空格,然后是右参数。

1
2
3
4
5
6
"%,%" <- function(x, y) paste0(x,",", y)

# test run

"Hello" %,%"World"
## [1]"Hello, World"

R的基数提供%*%(矩阵乘法),%/%(整数除法),%in%(是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用户使用。正如David Arenburg在评论中提到的那样,此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%运算符。

包装器R包装器包装器定义了点管道%.>%,该点管道是%>%的显式版本,因为它不隐式插入参数,而仅替代右侧对dot的显式使用。这可以被视为%>%的另一种选择。参见https://winvector.github.io/wrapr/articles/dot_pipe.html

Bizarro管。这实际上不是管道,而是一些聪明的基本语法,以类似于管道的方式工作,而无需实际使用管道。在http://www.win-vector.com/blog/2017/01/using-the-bizarro-pipe-to-debug-magrittr-pipelines-in-r/中进行了讨论,其想法是代替编写:

1
2
1:8 %>% sum %>% sqrt
## [1] 6

一个人写道:在这种情况下,我们显式使用dot而不是省略dot参数,并在管道的每个组件结尾分配一个名称为dot(.)的变量。我们在此之后使用分号。

1
2
1:8 ->.; sum(.) ->.; sqrt(.)
## [1] 6

更新添加了有关expm软件包的信息,并在顶部提供了简化示例。添加了postlogic软件包。


在阅读G.Grothendieck提供的链接后,我的理解是%>%是通过管道传递函数的运算符,以提高可读性和生产率,因为通过嵌套这些函数比通过嵌套嵌套多个函数要容易得多。


%>%与Unix中的管道相似。例如,在

1
a <- combined_data_set %>% group_by(Outlet_Identifier) %>% tally()

combined_data_set的输出将进入group_by,其输出将进入tally,然后将最终输出分配给a

这为您提供了便捷而简单的方法来串联使用函数,而无需创建变量和存储中间值。


R软件包dplyr和sf从R软件包magrittr导入运算符%>%。

使用以下命令可获得帮助:

1
?'%>%'

当然必须在使用例如

1
library(sf)

magrittr前管运算符的文档提供了一个很好的示例:
当函数仅需要一个参数时,x%>%f等于f(x)