在不破坏 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()
是否有添加到 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()