首页 文章

dplyr magrittr qplot =没有情节?

提问于
浏览
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))

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

2 回答

  • 5

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

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

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

    似乎应该有更好的方法 .

  • 2

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

    我从来没有使用过 %T>% tee,我也不想打印或绘图 . 而且我从来不想打印/绘制被自己管道的对象(通常是一个大数据集) . 所以我从不使用 %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)之间的歧义,但是没有找到可靠的方法 .

相关问题