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解决方案确实更容易"清理".
@ 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(…)
从功能中删除.
%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)
归档时间: |
|
查看次数: |
385 次 |
最近记录: |