dplyr+;magrittr+;qplot=没有绘图?

dplyr+;magrittr+;qplot=没有绘图?,r,ggplot2,dplyr,magrittr,R,Ggplot2,Dplyr,Magrittr,我想使用qplot(ggplot2),然后使用magrittr转发数据: 这项工作: mtcars %>% qplot(mpg, cyl, data=.) 这会产生一个错误: mtcars %>% qplot(mpg, cyl, data=.) %>% summarise(mean(mpg)) 而这些只会产生汇总统计数据: mtcars %T>% qplot(mpg, cyl, data=.) %>% summarise(mean(mpg)) mtcars %&

我想使用
qplot
(ggplot2),然后使用
magrittr
转发数据:

这项工作:

mtcars %>% qplot(mpg, cyl, data=.)
这会产生一个错误:

mtcars %>% qplot(mpg, cyl, data=.) %>% summarise(mean(mpg))
而这些只会产生汇总统计数据:

mtcars %T>% qplot(mpg, cyl, data=.) %>% summarise(mean(mpg))
mtcars %>% {qplot(mpg, cyl, data=.); .} %>% summarise(mean(mpg))
mtcars %T>% {qplot(mpg, cyl, data=.)} %>% summarise(mean(mpg))

有什么问题?我已经找到了解决方案,但它没有帮助,正如您从所附代码中看到的。

所有ggplot2函数都返回一个表示绘图的对象-要查看它,您需要打印它。这通常在控制台中工作时自动发生,但需要在函数或链中显式显示

我能想到的最优雅的解决方案是:

library("ggplot2")
library("magrittr")
library("dplyr")

echo <- function(x) {
  print(x)
  x
}
mtcars %>% 
  {echo(qplot(mpg, cyl, data = .))} %>% 
  summarise(mean(mpg))
库(“ggplot2”)
图书馆(“magrittr”)
图书馆(“dplyr”)
回声%
{echo(qplot(mpg,cyl,data=)}%>%
总结(平均值(mpg))

似乎应该有更好的方法。

这对我来说似乎更干净,因为它不需要使用
%T>%
(这会使管道更难重新排列和读取),也不需要在表达式周围使用
{}
,以避免将对象传递到那里。我不确定传递对象并忽略它会有多大的危害

我从未使用过
%T>%
T恤,因为我不想打印或打印。而且我从来都不想打印/打印被管道传输的对象本身(通常是一个大数据集)。所以我从不使用
%T>%

library("ggplot2")
library("dplyr")


pap = function(pass, to_print = NULL, side_effect = NULL) {
  if( !is.null(to_print)) {
    if (is.function(to_print)) {
      print(to_print(pass))
    } else {
      print(to_print)
    }
  }
  side_effect
  invisible(pass)
}

mtcars  %>% 
   pap(summary) %>% 
   pap(side_effect = plot(.)) %>% 
   pap(qplot(mpg, cyl, data = .)) %>% 
   summarise(mean(mpg))

我通常不会在管道中使用绘图作为副作用,因此上述解决方案最适合我(需要“额外键入”副作用绘图)。我希望能够自动消除这些预期场景(例如plot vs.qplot)之间的歧义,但尚未找到可靠的方法。

您似乎正在传递ggplot对象。可以在ggplot对象中应用摘要吗?但是
%T>%
%>%{f(.;.}
不随结果对象移动,而是返回输入对象(请参见:)。关于:
mtcars%%>%{print(qplot(mpg,cyl,data=);。}%>%summary(mean(mpg))
?这就是你想要的吗?可能与:是的!问题是:为什么没有打印就不能工作?谢谢!它确实需要更好的解决方案,因为您鼓励将
magrittr
dplyr
ggplot2
相结合,如果您必须使用这种技巧使绘图工作正常,
magritr
1.5
%T>$
的效果较差。@Tim这个例子对我来说似乎是被迫的,因为通常绘图是管道中的最后一件事。实际上,这是现实生活中的一件事(简化):
获取数据->绘图摘要->分组并重新排列->计算一些统计数据等。
在本例中,绘图的作用是进行初步数据检查。简单一点:
mtcars%T>%{print(qplot(mpg,cyl,data=)}%>%summary(mean(mpg))
或者
mtcars%T>%{摘要(,平均值(mpg))%>%print;}%>%qplot(mpg,cyl,data=)
。后者更符合@hadley关于将绘图保留在管道末端的评论。我向magritr软件包提交了一个功能请求,类似于%g>%,这可能会更容易。