我应该使用 %$% 而不是 %>% 吗?

Should I use %$% instead of %>%?

最近我找到了%$%管道运算符,但我没有注意到它与%>%的区别以及它是否可以完全取代它。


使用动机%$%

mtcars %>% summary()
mtcars %$% summary(.)
mtcars %>% head(10)
mtcars %$% head(.,10)
mtcars %>% plot(.$hp, .$mpg) # Does not work
mtcars %$% plot(hp, mpg)     # Works
mtcars %>% lm(mpg ~ hp, data = .)
mtcars %$% lm(mpg ~ hp)

文档

我们在各自的帮助页面中找到以下信息。

(?magrittr::`%>%`):

Description:

     Pipe an object forward into a function or call expression.

Usage:

     lhs %>% rhs

(?magrittr::`%$%`):

Description:

     Expose the names in ‘lhs’ to the ‘rhs’ expression. This is useful
     when functions do not have a built-in data argument.

Usage:

     lhs %$% rhs

我无法理解这两个管道运算符之间的区别。 管道对象公开名称有什么区别?但是,在 %$% 的 rhs 中,我们能够通过 . 获取管道对象,对吗?


我应该开始使用 %$% 而不是 %>% 吗?这样做会遇到哪些问题?

除了提供的评论:

%$% 也称为博览会管道 vs. %>%:

这是本文的简短摘要https://towardsdatascience.com/3-lesser-known-pipe-operators-in-tidyverse-111d3411803a

“使用 %$% 或 %>% 的主要区别在于所用函数的参数类型。”

一个优势,据我所知,对我来说唯一一个使用 %$% 而不是 %>% 的事实是 我们可以避免在没有数据作为参数的函数中重复输入数据框名称。

例如 lm() 有一个数据参数。在这种情况下,我们可以使用 %>%%$% 可互换

但是在 cor() 这样的函数中 没有数据参数:

mtcars %>% cor(disp, mpg) # Will give an Error
cor(mtcars$disp, mtcars$mpg)

等同于

mtcars %$% cor(disp, mpg)

注意要使用 %$% 管道运算符,您必须加载 library(magrittr)

更新: 关于 OP 评论: 管道独立,它允许我们将机器或计算机语言转换为更易读的人类语言。

ggplot2 很特别。 ggplot2 内部不一致。 ggplot1 比 ggplot2

更整洁 API

管道可以与 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

不,你不应该经常使用 %$%。这就像使用 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

reprex package (v2.0.1.9000)

创建于 2022-02-06

您会遇到与 x %$% mean(.) 类似的错误。

即使 LHS 有名称,它也不会自动将 . 参数放在第一个位置。例如,

mtcars %>% nrow()
#> [1] 32
mtcars %$% nrow()
#> Error in nrow(): argument "x" is missing, with no default

reprex package (v2.0.1.9000)

创建于 2022-02-06

在这种情况下 mtcars %$% nrow(.) 可以工作,因为 mtcars 有名字。

你的例子涉及 .$hp.$mpg 说明了 magrittr 管道的一个奇怪之处。因为 . 仅在表达式中使用,而不是单独作为参数,所以它作为第一个参数传递以及在这些表达式中传递。您可以使用大括号避免这种情况,例如

mtcars %>% {plot(.$hp, .$mpg)}