4

我想使用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))

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

4

2 回答 2

6

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

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

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

echo <- function(x) {
  print(x)
  x
}
mtcars %>% 
  {echo(qplot(mpg, cyl, data = .))} %>% 
  summarise(mean(mpg))

似乎应该有更好的方法。

于 2014-12-04T15:06:25.867 回答
2

这对我来说似乎更干净,因为它不需要使用%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))

我通常不会在我的管道中使用绘图作为副作用,所以上面的解决方案最适合我(需要“额外输入”来绘制副作用图)。我希望能够自动消除这些预期场景(例如绘图与 qplot)之间的歧义,但还没有找到可靠的方法。

于 2016-02-02T17:00:27.813 回答