提问人:alfakini 提问时间:11/25/2014 最后编辑:Gregor Thomasalfakini 更新时间:10/24/2023 访问量:610650
%>% 函数在 R 中是什么意思?
What does %>% function mean in R?
答:
%...% 运算符
%>%
没有内置含义,但用户(或包)可以自由地以他们喜欢的任何方式定义表单的运算符。例如,此函数将返回一个字符串,该字符串由其左参数组成,后跟逗号和空格,然后是右参数。%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
评论
?"%<>%"
%>%
在阅读了 G.Grothendieck 提供的链接后,我的理解是 %>% 是一个通过管道传输函数的运算符。这有助于提高可读性和工作效率,因为在嵌套多个函数时,通过这些管道跟踪多个函数的流程比向后移动更容易。
评论
%>%
类似于 Unix 中的管道。例如,在
a <- combined_data_set %>% group_by(Outlet_Identifier) %>% tally()
的输出将进入,其输出将进入,然后将最终输出分配给 。combined_data_set
group_by
tally
a
这为您提供了方便而简单的方法来串联使用函数,而无需创建变量和存储中间值。
评论
R 包 dplyr 和 sf 从 R 包 magrittr 导入运算符 %>%。
使用以下命令可提供帮助:
?'%>%'
当然,在加载包之前必须使用 例如
library(sf)
magrittr 前管运算符的文档给出了一个很好的例子:
当函数只需要一个参数时,相当于x %>% f
f(x)
评论
我对此了解不多,但我在大学学习 R 中的多元正态分布期间的一个案例研究中看到了它
假设您在一个名为“df_gather”的变量中有一个数据帧,并且您想将其通过管道输送到 ggplot 中,那么您可以使用它%>%
例如:
df_gather %>% ggplot(aes(x = Value, fill = Variable, color = Variable))+
geom_density(alpha = 0.3)+ggtitle('Distibution of X')
%---% 的另一个用法是使用 which 表示多赋值运算符,例如:%<-%
session <- function(){
x <- 1
y <- 2
z <- y + x
list(x,y,z)
}
c(var1,var2,result) %<-% session()
%>%
是 magrigtr 的管道运算符,广泛用于其他 Tidyverse 和兼容包中。
理解它的基本方法是它采用左侧 (LHS) 并将其转换为右侧 (RHS) 的第一个参数。 是特殊的语法,本质上是.如果 RHS 只有一个参数,您可以省略括号,例如 变成.x %>% f(y)
f(x,y)
x %>% f
f(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/|>
评论
?'%>%'
library(magrittr)
library(dplyr)
?'%>%'