在每个过滤步骤打印数据框尺寸

Car*_*rus 3 r magrittr tidyverse

我使用tidyverse来过滤掉一个数据帧,并希望在中间对象的尺寸(或nrows)的每一步打印.我以为我可以简单地使用magrittr的三通管道操作员,但它不起作用.我想我理解发球管背后的概念,但无法弄清楚出了什么问题.我进行了广泛的搜索,但没有找到太多关于三通管的资源.

我用mtcars数据集构建了一个简单的例子.如果我用dim()或nrow()替换,则打印中间对象可以正常工作.

library(tidyverse)
library(magrittr)

mtcars %>% 
    filter(cyl > 4) %T>% dim() %>%
    filter(am == 0) %T>% dim() %>%
    filter(disp >= 200) %>% dim()
Run Code Online (Sandbox Code Playgroud)

我当然可以在R base中写这个但是想坚持整齐的精神.我可能看到了关于T恤管概念的一些内容,我们将非常感谢任何评论/解决方案.

编辑: 关注@hrbrmstr和@akrun很好和快速的答案,我再次尝试坚持tee管道操作员而不编写函数.我不知道为什么我之前没有找到答案,但这里是我正在寻找的语法:

mtcars %>% filter(cyl > 4) %T>% {print(dim(.))} %>% filter(am == 0) %T>% {print(dim(.))} %>% filter(disp >= 200) %>% {print(dim(.))}

尽管需要一个功能,@ hrbrmstr解决方案确实更容易"清理".

hrb*_*str 5

@ akrun的想法有效,但这不是惯用的tidyverse.其中的其他函数tidyverse,比如print()并且glimpse()无形地返回数据参数,因此它们可以通过管道传输而无需借助{}.{}在您完成探索之后,这些很难清理管道.

尝试:

library(tidyverse)

tidydim <- function(x) {
  print(dim(x))
  invisible(x)
}

mtcars %>%
  filter(cyl > 4) %>%
  tidydim() %>% 
  filter(., am == 0) %>%
  tidydim() %>% 
  filter(., disp >= 200) %>%
  tidydim()
Run Code Online (Sandbox Code Playgroud)

这样你的"清理"(即不产生临时控制台输出)可以快速/轻松地删除tidydim()线print(…)从功能中删除.


Moo*_*per 5

%T>%库中的管道magrittr是专门为这种类型的情况创建的:

library(magrittr)
library(dplyr)
mtcars %>%
  filter(cyl > 4)     %T>% {print(dim(.))} %>%
  filter(am == 0)     %T>% {print(dim(.))} %>%
  filter(disp >= 200) %T>% {print(dim(.))}
Run Code Online (Sandbox Code Playgroud)

如果您和我一样,那么在Rstudio使用中非常容易阅读和编辑。alt + selection

如果您不喜欢括号,您也可以在此处使用 @hrbrmstr 的函数,除非您不需要最后一行。


几个月后重新审视它,这里有一个概括 @hrbmst 解决方案的想法,这样您就可以打印几乎您想要的内容并返回输入以继续使用管道。

library(tidyverse)
pprint <- function(.data,.fun,...){
  .fun <- purrr::as_mapper(.fun)
  print(.fun(.data,...))
  invisible(.data)
}

iris %>%
  pprint(~"hello")           %>%
  head(2)                    %>%
  select(-Species)           %>%
  pprint(rowSums,na.rm=TRUE) %>%
  pprint(~rename_all(.[1:2],toupper)) %>%
  pprint(dim)

# [1] "hello"
#    1    2 
# 10.2  9.5 
#   SEPAL.LENGTH SEPAL.WIDTH
# 1          5.1         3.5
# 2          4.9         3.0
# [1] 2 4
Run Code Online (Sandbox Code Playgroud)