为什么 magrittr %<>% 赋值管道不能与 R 的本地管道 (|>) 一起使用
Why isn't the magrittr %<>% assignment pipe working with R's native pipe (|>)
我注意到用 |>
搜索替换 %>%
确实会导致一些错误。显而易见的是缺少占位符,即
mtcars %>%
lm(mpg ~ hp, data = .)
必须改写为:
mtcars |>
(\(d) lm(mpg ~ hp, data = d))()
出现的另一件事是 %<>%
突然无法按预期工作。
分配管道 %<>%
不再到期的原因是 operator precedence。 %<>%
出现在 |>
之前,请参见下面的示例:
library(magrittr)
library(tidyverse)
a <- tibble(a = 1:3)
a %<>%
mutate(b = a * 2) |>
mutate(c = a * 3) |>
filter(a <= 2)
a
Returns
# A tibble: 3 × 2
a b
<int> <dbl>
1 1 2
2 2 4
3 3 6
因此
a %<>%
mutate(b = a * 2)
是唯一保存的部分。您还可以感觉到,当您打印出预期的 table 时可能就是这种情况,而 tibble 分配永远不会出现这种情况。
从 R 4.2.0 开始,通过正向管道,您现在可以使用下划线占位符(与 magrittr 的点对应)将对象通过管道传递给选定的命名参数:
In a forward pipe |> expression it is now possible to use a named argument with the placeholder _ in the rhs call to specify where the lhs is to be inserted. The placeholder can only appear once on the rhs.
mtcars |>
lm(mpg ~ hp, data = _)
Call:
lm(formula = mpg ~ hp, data = mtcars)
Coefficients:
(Intercept) hp
30.09886 -0.06823
我注意到用 |>
搜索替换 %>%
确实会导致一些错误。显而易见的是缺少占位符,即
mtcars %>%
lm(mpg ~ hp, data = .)
必须改写为:
mtcars |>
(\(d) lm(mpg ~ hp, data = d))()
出现的另一件事是 %<>%
突然无法按预期工作。
分配管道 %<>%
不再到期的原因是 operator precedence。 %<>%
出现在 |>
之前,请参见下面的示例:
library(magrittr)
library(tidyverse)
a <- tibble(a = 1:3)
a %<>%
mutate(b = a * 2) |>
mutate(c = a * 3) |>
filter(a <= 2)
a
Returns
# A tibble: 3 × 2
a b
<int> <dbl>
1 1 2
2 2 4
3 3 6
因此
a %<>%
mutate(b = a * 2)
是唯一保存的部分。您还可以感觉到,当您打印出预期的 table 时可能就是这种情况,而 tibble 分配永远不会出现这种情况。
从 R 4.2.0 开始,通过正向管道,您现在可以使用下划线占位符(与 magrittr 的点对应)将对象通过管道传递给选定的命名参数:
In a forward pipe |> expression it is now possible to use a named argument with the placeholder _ in the rhs call to specify where the lhs is to be inserted. The placeholder can only appear once on the rhs.
mtcars |>
lm(mpg ~ hp, data = _)
Call:
lm(formula = mpg ~ hp, data = mtcars)
Coefficients:
(Intercept) hp
30.09886 -0.06823