R中%>%函数是什么意思?


119

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


10
或看看?'%>%'
jbaums

6
谢谢大卫!jbaums,很遗憾,没有关于此的文档。?'%>%'重新调整“在指定的软件包和库中没有'%>%'的文档”
alfakini 2014年

6
@alf。你需要library(magrittr)library(dplyr)先运行?'%>%',虽然我的链接提供了更多的信息了
大卫Arenburg

1
另外,在这里
David Arenburg 2014年

Answers:


141

%...%个运算符

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

"%,%" <- function(x, y) paste0(x, ", ", y)

# test run

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

R的基数提供%*%(矩阵多重乘法), %/%(整数除法)%in%(是rhs的组成部分),%o%(外部乘积)和%x%(kronecker乘积)。尚不清楚是否%%属于此类别,但它代表模。

expr 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现在建议用户使用%>%从magrittr导入的dplyr并将其提供给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包装器包装器定义了一个点管道%.>%,它是的显式版本%>%,它不隐式插入参数,而仅替代右侧对点的显式使用。这可以视为的另一种选择%>%。参见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:8 %>% sum %>% sqrt
## [1] 6

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

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

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


1
我还看到:%<>%,%T>%,%$%,它们做什么?rpackages.ianhowson.com/cran/magrittr/man/pipe.html
pluke

从装载magrittr获得帮助之后的R内使用:?"%<>%"
G.格罗腾迪克


9

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

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

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

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


-1

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

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

?'%>%'

当然,在使用之前,必须先装入软件包

library(sf)

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


1
似乎在stackoverflow.com/a/27129032/570918中已经对此进行了很好的解释。
Merv
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.