R>%>%函数的含义是什么?

alf*_*ini 88 syntax r r-faq dplyr magrittr

我已经看到在dplyrrvest%>%等一些软件包中使用(百分比大于百分比)函数.这是什么意思?这是在R中编写闭包块的方法吗?

G. *_*eck 121

%...%运营商

%>%没有内置意义,但用户(或包)可以%whatever%任意方式自由定义表单的运算符.例如,此函数将返回一个字符串,该字符串由其左参数后跟逗号和空格组成,然后是右参数.

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

# test run

"Hello" %,% "World"
## [1] "Hello, World"
Run Code Online (Sandbox Code Playgroud)

R的基数提供%*%(矩阵多重化), %/%(整数除法),%in%(是ls 的rhs的一个组成部分),%o%(外部产品)和%x%(kronecker产品).目前尚不清楚是否%%属于这一类别,但它代表模数.

expm R包,expm,定义矩阵幂运算符%^%.有关示例,请参阅R中的Matrix power.

运算符R包已定义了大量此类运算符,例如%!in%(for not %in%).见http://cran.r-project.org/web/packages/operators/operators.pdf

管道

magrittr%>%magrittr R包的情况下,已经按照magrittr vignette中的讨论定义了它.见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%运营商.

wrapr R包,wrapr,定义了%.>%一个明确版本的点管道,%>%因为它不会隐式插入参数,而只是替代右侧的点的显式使用.这可以被视为另一种选择%>%.请参阅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
Run Code Online (Sandbox Code Playgroud)

一个人写下面的内容.在这种情况下,我们明确使用点而不是删除点参数,并结束管道的每个组件,并赋值给名为dot(.)的变量.我们用分号跟着它.

1:8 ->.; sum(.) ->.; sqrt(.)
## [1] 6
Run Code Online (Sandbox Code Playgroud)

更新有关expm包的更多信息和顶部的简化示例.添加了postlogic包.


Fra*_*cho 12

阅读G.Grothendieck提供链接后,我的理解是%>%是一个管理函数的运算符,以提高可读性和生产率,因为通过这些管道更容易跟踪多个函数的流程,而不是在多个函数嵌套时向后移动.


小智 7

%>%类似于Unix中的管道.例如,在

a <- combined_data_set %>% group_by(Outlet_Identifier) %>% tally()
Run Code Online (Sandbox Code Playgroud)

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

这使您可以方便,轻松地使用串联函数,而无需创建变量和存储中间值.