我应该使用 %$% 而不是 %>% 吗?
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)}
最近我找到了%$%
管道运算符,但我没有注意到它与%>%
的区别以及它是否可以完全取代它。
使用动机%$%
- 运算符
%$%
在很多情况下可以代替%>%
:
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)}