在不破坏 tidyverse 管道的情况下打印中间结果

Printing intermediate results without breaking pipeline in tidyverse

是否有添加到 tidyverse 管道的命令不会中断流程,但会产生一些副作用,比如打印一些东西。我想到的用例是这样的。如果是管道

data %>%
  mutate(new_var = <some time consuming operation>) %>%
  mutate(new_var2 = <some other time consuming operation>) %>%
  ...

我想向管道添加一些命令,它不会修改最终结果,但会打印出一些进度或事物的状态。也许是这样的:

data %>%
  mutate(new_var = <some time consuming operation>) %>%
  command_x(print("first operation done")) %>%
  mutate(new_var2 = <some other time consuming operation>) %>%
  ...

现在有这样的command_x吗?

您可以轻松编写自己的函数

pass_through <- function(data, fun) {fun(data); data}

并像

一样使用它
mtcars %>% pass_through(. %>% ncol %>% print) %>% nrow

这里我们使用. %>%语法来创建一个匿名函数。你也可以用

更明确地写你自己的
mtcars %>% pass_through(function(x) print(ncol(x))) %>% nrow

对于在管道中打印中间步骤的特定情况,只需使用 %>% print() %>%。例如,

mtcars %>%
  filter(cyl == 4) %>%
  print() %>%
  summarise(mpg = mean(mpg))

对于简单的状态消息,您可以这样做:

pipe_message = function(.data, status) {message(status); .data}
mtcars %>%
  filter(cyl == 4) %>%
  pipe_message("first operation done") %>%
  select(cyl)

请参阅@MrFlick 的回答,了解针对非print 函数的更通用的解决方案。

您可以使用匿名函数即时执行:

mtcars %>% ( function(x){print(x); return(x)} ) %>% nrow()