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

What does %>% function mean in R?

提问人:alfakini 提问时间:11/25/2014 最后编辑:Gregor Thomasalfakini 更新时间:10/24/2023 访问量:610650

问:

我已经看到在一些软件包(如 dplyrrvest)中使用了 (percent greater than percent) 函数。这是什么意思?这是一种在 R 中编写闭包块的方法吗?%>%

R 语法 dplyr magrittr r-faq

评论

16赞 jbaums 11/25/2014
或查看?'%>%'
9赞 alfakini 11/25/2014
谢谢大卫!Jbaums,不幸的是,没有关于此的文档。?'%>%“重新调整”指定包和库中没有'%>%'的文档”
7赞 David Arenburg 11/25/2014
@alf。您需要先或先运行,尽管我的链接提供了更多信息library(magrittr)library(dplyr)?'%>%'
1赞 David Arenburg 11/25/2014
另外,请看这里
2赞 Joshua Ulrich 9/16/2015
相关新闻: %>% 在 R 中是什么意思

答:

222赞 G. Grothendieck 11/25/2014 #1

%...% 运算符

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

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

# test run

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

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

expm(英语:expm)R 包 expm 定义了一个矩阵幂算子。有关示例,请参阅 R 中的矩阵功率%^%

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

iGraph 的此软件包定义了 %--% 、 %->% 和 %<-% 来选择边缘。

润滑剂此包定义 %m+% 和 %m-% 以添加和减去月份,并定义 %--% 以定义间隔。igraph 还定义了 %--% 。

管道

马格里特在 magrittr 的情况下,R 包已将其定义为 magrittr 小插图中讨论的内容。查看 http://cran.r-project.org/web/packages/magrittr/vignettes/magrittr.html%>%

Magittr 还定义了许多其他此类运算符。有关更多详细信息,请参阅上一个链接的“其他管道操作员”部分,其中讨论了 和 和 http://cran.r-project.org/web/packages/magrittr/magrittr.pdf%T>%%<>%%$%

德普莱尔用于定义类似运算符的 dplyr R 包;但是,它已被弃用,DPLYR 现在建议用户使用 DPLYR 从 Magrittr 导入并提供给 DPLYR 用户。正如 David Arenburg 在评论中提到的,这个 SO 问题讨论了它与 magrittr 的区别: %.% (dplyr) 和 %>% (magrittr) 之间的差异%.%%>%%>%

胡椒属R 包 pipeR 定义了一个类似于 magrittr 的 %>% 的运算符,可以用作它的替代方法。查看 http://renkun.me/pipeR-tutorial/%>>%

pipeR 包还定义了许多其他此类运算符。请参见:http://cran.r-project.org/web/packages/pipeR/pipeR.pdf

后逻辑后逻辑包定义和运算符。%if%%unless%

包装器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 包和简化示例的信息。添加了后逻辑包。

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

更新 3在最新版本的 R 中,可以在 RHS 上使用下划线 _ 来指定与第一个参数不同的参数。我

"banana" |> grepl("an", x = _)

它只能使用一次,不能用于调用中的调用,并且必须命名 _ 参数。

# Specify name.
"banana" |> grepl("an", _)  # bad
"banana" |> grepl("an", x = _) # ok

# Must be an argument to grepl, not sub.  Break into two.
"banana" |> grepl("an", x = sub("n", "m", x = _)) # bad
"banana" |> sub("n", "m", x = _) |> grepl("an", x = _) # ok

# Can only be used once on RHS. 
"banana" |> grepl(pattern = _, x _) # bad
"banana" |> list(. = _) |> with(grepl(pattern = ., .)) # ok

评论

1赞 pluke 5/20/2016
我还看到:%<>%、%T>%、%$%,他们做什么?rpackages.ianhowson.com/cran/magrittr/man/pipe.html
0赞 G. Grothendieck 5/20/2016
加载 magrittr 后,从 R 中获取使用以下帮助:等。?"%<>%"
0赞 qwr 10/24/2023
这比标题回答的要多得多。%>%
31赞 Francisco López-Sancho 10/15/2016 #2

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

评论

0赞 Christopher Stephan 12/24/2017
提到的优点在这里通过代码示例进行了演示。
44赞 RAJAT BHATHEJA 3/21/2018 #3

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

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

的输出将进入,其输出将进入,然后将最终输出分配给 。combined_data_setgroup_bytallya

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

评论

0赞 qwr 10/24/2023
有关数据如何流入 RHS 的解释,请参阅我的回答。
1赞 HKE 9/2/2018 #4

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

使用以下命令可提供帮助:

?'%>%'

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

library(sf)

magrittr 前管运算符的文档给出了一个很好的例子: 当函数只需要一个参数时,相当于x %>% ff(x)

评论

2赞 merv 3/22/2019
似乎这在 stackoverflow.com/a/27129032/570918 中已经得到了很好的解释。
-2赞 Shivam Panchbhai 5/4/2021 #5

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

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

例如:

df_gather %>% ggplot(aes(x = Value, fill = Variable, color = Variable))+
geom_density(alpha = 0.3)+ggtitle('Distibution of X')
0赞 Hamzah 12/23/2021 #6

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

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

c(var1,var2,result) %<-% session()
1赞 qwr 10/24/2023 #7

%>%是 magrigtr 的管道运算符,广泛用于其他 Tidyverse 和兼容包中。

理解它的基本方法是它采用左侧 (LHS) 并将其转换为右侧 (RHS) 的第一个参数。 是特殊的语法,本质上是.如果 RHS 只有一个参数,您可以省略括号,例如 变成.x %>% f(y)f(x,y)x %>% ff(x)

管道可以连接在一起。这使您可以编写从左到右传递数据的函数(如 unix 管道),而不是从内到外读取的嵌套函数调用。考虑遵循以下逻辑流程

mtcars %>% subset(hp > 100) %>% print 

与传统的相比

print(subset(mtcars, hp > 100))

或创建中间变量。

管道版本从左到右阅读更自然,括号更少,作为数据转换/建模任务中的步骤。它还允许您轻松地将步骤插入到流程中,而无需摆弄嵌套函数。

有用地,当它不是第一个函数时,用作 RHS 的占位符。例如,表示 。Tidyverse 包设计时将“data”作为第一个参数,因此您通常不需要它。.x %>% f(y, .)f(y, x)

有趣的百分号语法是 R 允许用户定义自己的中缀函数的方式。R 中内置中缀运算符的一个示例是 ;in 实际上执行函数调用(您可以通过键入 in 查看源代码来查看这一点)。++1 + 2`+`(1, 2)`+`

有关详细信息,请参阅 https://cran.r-project.org/web/packages/magrittr/vignettes/magrittr.html

管道运算符非常有用,以至于 R 4.1 添加了本机管道。虽然它没有那么有特色,而且它仍然很新。查看 https://www.tidyverse.org/blog/2023/04/base-vs-magrittr-pipe/|>

评论

0赞 Lori 12/17/2023
所以基本上它把 R 变成了长生不老药?
0赞 qwr 12/18/2023
我不熟悉长生不老药。然而,tidyverse 借鉴了 lisp 的函数式范式和编程语言特性