最近我找到了%$%管道操作符,但我忽略了它与它的区别%>%以及它是否可以完全取代它的要点。
%$%%$%可以替换:%>%mtcars %>% summary()\nmtcars %$% summary(.)\nmtcars %>% head(10)\nmtcars %$% head(.,10)\nRun Code Online (Sandbox Code Playgroud)\n%$%比以下更有用%>%:mtcars %>% plot(.$hp, .$mpg) # Does not work\nmtcars %$% plot(hp, mpg) # Works\nRun Code Online (Sandbox Code Playgroud)\nmtcars %>% lm(mpg ~ hp, data = .)\nmtcars %$% lm(mpg ~ hp)\nRun Code Online (Sandbox Code Playgroud)\n%和$在键盘上彼此相邻,因此插入%$%比插入更方便%>%。我们在各自的帮助页面中找到以下信息。
\n( ?magrittr::`%>%`):
Description:\n\n Pipe an object forward into a function or call expression.\n\nUsage:\n\n lhs %>% rhs\nRun Code Online (Sandbox Code Playgroud)\n( ?magrittr::`%$%`):
Description:\n\n Expose the names in \xe2\x80\x98lhs\xe2\x80\x99 to the \xe2\x80\x98rhs\xe2\x80\x99 expression. This is useful\n when functions do not have a built-in data argument.\n\nUsage:\n\n lhs %$% rhs\nRun Code Online (Sandbox Code Playgroud)\n我无法理解两个管道运算符之间的区别。管道对象和暴露名称之间有什么区别?但是,在 的 rhs 中%$%,我们能够使用 获取管道对象.,对吧?
我应该开始使用%$%而不是%>%?这样做我可能会遇到哪些问题?
Tar*_*Jae 13
除了提供的评论之外:
%$% 也称为 Exposition 管道vs. %>%:
这是本文的简短摘要https://towardsdatascience.com/3-lesser-known-pipe-operators-in-tidyverse-111d3411803a
“使用 %$% 或 %>% 的主要区别在于所使用函数的参数类型。”
据我所知,对我来说唯一可以使用的优点%$%是%>%,我们可以避免在没有数据作为参数的函数中重复输入数据帧名称。
例如,lm()有一个数据参数。在这种情况下,我们可以同时使用%>%和 ,并且%$%可以互换。
但在像 the 这样的函数中,cor()没有数据参数:
mtcars %>% cor(disp, mpg) # Will give an Error
Run Code Online (Sandbox Code Playgroud)
cor(mtcars$disp, mtcars$mpg)
Run Code Online (Sandbox Code Playgroud)
相当于
mtcars %$% cor(disp, mpg)
Run Code Online (Sandbox Code Playgroud)
请注意,要使用%$%管道运算符,您必须加载library(magrittr)
更新:关于OP的评论:独立于管道,它允许我们将机器或计算机语言转换为更易读的人类语言。
ggplot2 很特别。ggplot2 内部不一致。ggplot1 的 API 比 ggplot2 更简洁
管道可以与 ggplot1 一起使用:
library(ggplot1) mtcars %>% ggplot(list( x= mpg, y = wt)) %>% ggpoint() %>% ggsave("mtcars.pdf", width= 8 height = 6)
2016 年,Wick Hadley 说道:“如果我早 10 年前发现这个管道,ggplot2 newver 就已经存在了!” https://www.youtube.com/watch?v=K-ss_ag2k9E&list=LL&index=9
use*_*330 12
不,您不应该%$%经常使用。这就像使用with()函数一样,即在评估 RHS 时暴露 LHS 的组成部分。但它仅在左侧的值具有列表或数据框之类的名称时才有效,因此您不能总是使用它。例如,
library(magrittr)
x <- 1:10
x %>% mean()
#> [1] 5.5
x %$% mean()
#> Error in eval(substitute(expr), data, enclos = parent.frame()): numeric 'envir' arg not of length one
Run Code Online (Sandbox Code Playgroud)
由reprex 包于 2022 年 2 月 6 日创建(v2.0.1.9000)
您会收到类似的错误x %$% mean(.)。
即使 LHS 有名称,它也不会自动将.参数放在第一个位置。例如,
mtcars %>% nrow()
#> [1] 32
mtcars %$% nrow()
#> Error in nrow(): argument "x" is missing, with no default
Run Code Online (Sandbox Code Playgroud)
由reprex 包于 2022 年 2 月 6 日创建(v2.0.1.9000)
在这种情况下mtcars %$% nrow(.)可以工作,因为mtcars有名字。
你的例子涉及.$hp并且.$mpg正在说明管道的奇怪之处之一magrittr。因为.仅在表达式中使用,而不是单独作为参数,所以它作为第一个参数传递,并在这些表达式中传递。您可以使用大括号来避免这种情况,例如
mtcars %>% {plot(.$hp, .$mpg)}
Run Code Online (Sandbox Code Playgroud)