为什么 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