多个ggplots与magrittr tee操作员

Tim*_*ron 9 r ggplot2 magrittr

我试图弄清楚为什么当我将数据传递给ggplot命令时,tee运算符%T>%不起作用.

这很好用

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

mtcars %T>%
  qplot(x = cyl, y = mpg, data = ., geom = "point") %>%
  qplot(x = mpg, y = cyl, data = ., geom = "point")
Run Code Online (Sandbox Code Playgroud)

这也很好

mtcars %>%
  {ggplot() + geom_point(aes(cyl, mpg)) ; . } %>%
  ggplot() + geom_point(aes(mpg, cyl))
Run Code Online (Sandbox Code Playgroud)

但是当我使用tee运算符时,如下所示,它会抛出"错误:ggplot2不知道如何处理类protoenvironment的数据".

mtcars %T>%
  ggplot() + geom_point(aes(cyl, mpg)) %>%
  ggplot() + geom_point(aes(mpg, cyl))
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么最后一段代码不起作用?

Hug*_*ugh 8

mtcars %T>%
  {print(ggplot(.) + geom_point(aes(cyl, mpg)))} %>%
  {ggplot(.) + geom_point(aes(mpg, cyl))}
Run Code Online (Sandbox Code Playgroud)

或放弃%T>%运算符并使用普通管道,将"%> T%"操作明确表示为此答案中建议的新功能

techo <- function(x){
    print(x)
    x
  }

mtcars %>%
  {techo( ggplot(.) + geom_point(aes(cyl, mpg)) )} %>%
  {ggplot(.) + geom_point(aes(mpg, cyl))}
Run Code Online (Sandbox Code Playgroud)

正如TFlick指出的那样,%T>%运算符在这里不起作用的原因是因为操作的优先级:%any%之前完成+.


MrF*_*ick 6

我认为你的问题与操作顺序有关.该+比强%T>%(根据运营商?Syntax的帮助页).ggplot在添加geom_point其他东西之前,你需要传入data =参数.我想你想要的

mtcars %T>%
  {print(ggplot(.) + geom_point(aes(cyl, mpg)))} %>%
  {ggplot(.) + geom_point(aes(mpg, cyl))}
Run Code Online (Sandbox Code Playgroud)

它使用功能"短手"表示法

  • 您可能需要使用print包装第一个ggplot调用以获取对图形设备的两次调用. (3认同)