174

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

4

6 回答 6

190

%...% 运算符

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

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

# test run

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

R 的基数提供%*%(矩阵乘法)、 %/%(整数除法)、%in%(lhs 是 rhs 的组成部分吗?)、%o%(外积)和%x%(kronecker 积)。目前尚不清楚是否%%属于这一类,但它代表模数。

expm R 包 expm 定义了一个矩阵幂运算符%^%。有关示例,请参见R 中的矩阵幂

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

igraph这个包定义了 %--% 、 %->% 和 %<-% 来选择边。

lubridate 这个包定义了 %m+% 和 %m-% 来加减月份, %--% 来定义一个间隔。igraph 还定义了 %--% 。

管道

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 现在建议用户使用%>%which 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%操作符。

wrapr R 包 wrapr 定义了一个点管道%.>%,它是 的显式版本,%>%因为它不进行参数的隐式插入,而仅替换右侧的 dot 的显式使用。这可以被认为是另一种选择%>%。见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

一个人写了以下内容。在这种情况下,我们显式使用 dot 而不是省略 dot 参数,并以对名为 dot( .) 的变量的赋值结束管道的每个组件。我们用分号跟随它。

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

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

更新 2 R 的开发版本定义了一个|>管道。与 magrittr 不同%>%,它只能代入右侧的第一个参数。虽然有限,但它通过语法转换工作,因此对性能没有影响。

于 2014-11-25T14:16:10.117 回答
32

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

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

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

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

于 2018-03-21T06:10:56.043 回答
26

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

于 2016-10-14T22:56:30.740 回答
0

%---% 的另一种用法是使用%<-%which 表示多重赋值运算符,例如:

session <- function(){
x <- 1
y <- 2
z <- y + x
list(x,y,z)
}

c(var1,var2,result) %<-% session()
于 2021-12-22T21:26:17.463 回答
0

我对此知之甚少,但我在大学研究 R 中的多元正态分布期间的一个案例研究中看到了它

假设您在名为“df_gather”的变量中有一个数据框,并且您想将其通过管道传输到 ggplot 中,那么您可以使用它%>%

例如:

df_gather %>% ggplot(aes(x = Value, fill = Variable, color = Variable))+
geom_density(alpha = 0.3)+ggtitle('Distibution of X')
于 2021-05-04T09:25:59.950 回答
0

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

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

?'%>%'

当然,必须在使用之前加载包,例如

library(sf)

magrittr forward-pipe operator 的文档给出了一个很好的例子:当函数只需要一个参数时,x %>% f相当于f(x)

于 2018-09-02T12:46:10.403 回答