如何在一行代码中对aov对象执行两个独立的dplyr %>%操作?
用dplyr管道同时执行两个独立操作的优雅方法
你需要对同一个aov_bike对象分别执行summary()和plot(),而非链式传递前一个函数的输出,这里有两种简洁的实现方式:
方法1:大括号包裹多表达式
管道中的大括号{}允许你编写多个独立语句,用.指代管道传递过来的原始对象,从而依次执行两个操作:
aov_bike %>% {summary(.); plot(.)}
如果想换行提升可读性:
aov_bike %>% { summary(.) plot(.) }
原理:默认%>%会把左侧对象作为右侧函数的第一个参数,但使用大括号后,需要显式用.引用对象,括号内的每个语句会按顺序执行。
方法2:使用%T>% tee管道
%T>%是magrittr提供的「tee管道」(dplyr依赖magrittr,可直接使用),它会执行右侧函数,但返回左侧的原始对象,而非右侧函数的输出,这样就能连续对同一个原始对象执行多个操作:
aov_bike %T>% summary() %T>% plot()
原理:第一个%T>%将aov_bike传给summary()执行,随后返回aov_bike;第二个%T>%再把aov_bike传给plot()执行,完美实现你需要的两个独立操作。
你原来的代码aov_bike %>% summary() %>% plot()之所以不行,是因为普通%>%会把前一个函数的输出传递给下一个函数,实际执行的是plot(summary(aov_bike)),这显然不是你想要的效果。
内容的提问来源于stack exchange,提问作者Eldan Binyamini
相关产品推荐
相关产品推荐

