本机管道占位符

Dou*_*Fir 4 r

我意识到这个问题之前已经被问过,但没有点击。真的没有占位符吗?

例子:

my_mtcars <- mtcars %>% mutate(bla = c(1:nrow(.)))
my_mtcars$bla[10] <- NA
my_mtcars$bla[15] <- NA
Run Code Online (Sandbox Code Playgroud)

作品:

# magritr pipe to return NA rows while debugging a df
my_mtcars %>% filter(!complete.cases(.)) %>% glimpse
Run Code Online (Sandbox Code Playgroud)

不起作用:

# native piple equivilent
my_mtcars |> filter(!complete.cases(.)) |> glimpse()
Run Code Online (Sandbox Code Playgroud)

我尝试使用本机管道执行的操作的“正确”方法是什么?

G. *_*eck 5

本机 R 管道不使用点。它总是插入到第一个参数中。要获得点定义函数的效果,或者如果它位于开头,请自己重复输入将其组合起来(或将其分成两个管道并执行相同的操作 - 未显示,因为此处不适用)。

library(dplyr)

mtcars |>
  (\(x) filter(x, complete.cases(x)))() |>
  summary()
Run Code Online (Sandbox Code Playgroud)

或者

f <- function(x) filter(x, complete.cases(x))
mtcars |> f() |> summary()
Run Code Online (Sandbox Code Playgroud)

或者

filter(mtcars, complete.cases(mtcars)) |> summary()
Run Code Online (Sandbox Code Playgroud)

有时with可用于创建解决方法。这将创建一个包含一个名为 x 的元素的列表,然后在管道的下一段中使用该元素。

mtcars |>
  list() |>
  setNames("x") |>
  with(filter(x, complete.cases(x))) |>
  summary()
Run Code Online (Sandbox Code Playgroud)

请注意,您可以仅使用基本 R 来完成此操作 - Bizarro 管道,它不是真正的管道,但看起来像管道。

mtcars ->.;
  filter(., complete.cases(.)) ->.;
  summary(.)
Run Code Online (Sandbox Code Playgroud)

更新

由于这个问题出现,R 添加了一个 _ 占位符,因此该with示例可以缩短为:

# needs R 4.2 or later
mtcars |>
  list(x = _) |>
  with(filter(x, complete.cases(x))) |>
  summary()
Run Code Online (Sandbox Code Playgroud)