Search code examples
rggplot2magrittr

Multiple ggplots with magrittr tee operator


I am trying to figure out why the tee operator, %T>%, does not work when I pass the data to a ggplot command.

This works fine

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

mtcars %T>%
  qplot(x = cyl, y = mpg, data = ., geom = "point") %>%
  qplot(x = mpg, y = cyl, data = ., geom = "point")

And this also works fine

mtcars %>%
  {ggplot() + geom_point(aes(cyl, mpg)) ; . } %>%
  ggplot() + geom_point(aes(mpg, cyl))

But when I use the tee operator, as below, it throws "Error: ggplot2 doesn't know how to deal with data of class protoenvironment".

mtcars %T>%
  ggplot() + geom_point(aes(cyl, mpg)) %>%
  ggplot() + geom_point(aes(mpg, cyl))

Can anyone explain why this final piece of code does not work?


Solution

  • Either

    mtcars %T>%
      {print(ggplot(.) + geom_point(aes(cyl, mpg)))} %>%
      {ggplot(.) + geom_point(aes(mpg, cyl))}
    

    or abandon the %T>% operator and use an ordinary pipe with the "%>T%" operation made explicit as a new function as suggested in this answer

    techo <- function(x){
        print(x)
        x
      }
    
    mtcars %>%
      {techo( ggplot(.) + geom_point(aes(cyl, mpg)) )} %>%
      {ggplot(.) + geom_point(aes(mpg, cyl))}
    

    As TFlick noted, the reason the %T>% operator doesn't work here is because of the precedence of operations: %any% is done before +.