我已经看到在某些包(例如 dplyr 和 rvest )中使用了%>%
(大于百分比)。这是什么意思?这是在R中编写闭包的方法吗?
最佳答案
%...%个运算符%>%
没有内在的含义,但是用户(或程序包)可以随意以自己喜欢的任何方式定义%whatever%
形式的运算符。例如,此函数将返回一个字符串,该字符串包含其左参数,后跟逗号和空格,然后是右参数。
"%,%" <- function(x, y) paste0(x, ", ", y)
# test run
"Hello" %,% "World"
## [1] "Hello, World"
R的基数提供
%*%
(矩阵多乘法),%/%
(整数除法),%in%
(是否为rhs的组成部分),%o%
(外部产品)和%x%
(kronecker产品)。目前尚不清楚%%
是否属于此类,但它表示模。expm R包expm定义矩阵幂运算符
%^%
。有关示例,请参见Matrix power in 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.htmlmagittr还定义了许多其他此类运算符。请参阅先前链接的“其他管道运算符”部分,其中讨论了
%T>%
,%<>%
和%$%
和http://cran.r-project.org/web/packages/magrittr/magrittr.pdf甚至更多的详细信息。dplyr dplyr R软件包,用于定义类似的
%.%
运算符;但是,它已被弃用,并且dplyr现在建议用户使用%>%
,它是dplyr从magrittr导入的,并可供dplyr用户使用。正如David Arenburg在评论中提到的那样,这个SO问题讨论了它与magrittr的%>%
之间的区别:Differences between %.% (dplyr) and %>% (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包(包装器)定义了点管道
%.>%
,它是%>%
的显式版本,因为它不隐式插入参数,而仅替代右侧的点的显式使用。这可以被视为%>%
的另一种选择。参见https://winvector.github.io/wrapr/articles/dot_pipe.htmlBizarro管。这实际上不是管道,而是一些聪明的基本语法,以类似于管道的方式工作,而无需实际使用管道。在http://www.win-vector.com/blog/2017/01/using-the-bizarro-pipe-to-debug-magrittr-pipelines-in-r/中讨论了这个想法,而不是编写:
1:8 %>% sum %>% sqrt
## [1] 6
一个写道。在这种情况下,我们显式地使用dot而不是省略dot参数,并以名称为dot(
.
)的变量的赋值结束管道的每个组件。我们在此之后使用分号。1:8 ->.; sum(.) ->.; sqrt(.)
## [1] 6
更新添加了有关expm软件包的信息,并在顶部简化了示例。添加了poSTLogic软件包。