2014-12-03 12 views
7

Tôi đang cố gắng tìm ra lý do tại sao toán tử tee,% T>%, không hoạt động khi tôi chuyển dữ liệu sang lệnh ggplot.Nhiều ggplots với nhà điều hành tee magrittr

này hoạt động tố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") 

Và điều này cũng hoạt động tốt

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

Nhưng khi tôi sử dụng toán tử tee, như dưới đây, nó ném "Lỗi: ggplot2 không biết làm thế nào để đối phó với dữ liệu của lớp protoenvironment ".

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

Mọi người có thể giải thích lý do mã cuối cùng này không hoạt động không?

Trả lời

5

Hoặc

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

hoặc từ bỏ các nhà điều hành %T>% và sử dụng một ống thông thường với "%> T% "hoạt động được làm rõ ràng dưới dạng hàm mới là suggested in this answer

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

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

Như TFlick lưu ý, lý do toán tử% T>% không hoạt động ở đây là do ưu tiên của các phép toán: %any% được thực hiện trước +.

6

Tôi nghĩ rằng vấn đề của bạn phải liên quan đến thứ tự hoạt động. + mạnh hơn nhà điều hành %T>% (theo trang trợ giúp ?Syntax). Bạn cần truyền tham số data = vào số ggplot trước khi thêm geom_point nếu không mọi thứ trở nên lộn xộn. Tôi nghĩ rằng bạn muốn

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

trong đó sử dụng chức năng "ngắn tay" ký hiệu

+3

Bạn có thể cần phải quấn gọi ggplot đầu tiên với một bản in để có được cả hai cuộc gọi đến một thiết bị đồ họa. –

+0

@TylerRinker Tôi đã khắc phục sự cố. Cảm ơn! –

0

Lưu ý rằng đối tượng ggplot trả về là danh sách có trường dữ liệu $. Điều này có thể được thực hiện thuận lợi. Cá nhân tôi nghĩ rằng phong cách là sạch hơn :)

ggpass=function(pp){ 
print(pp) 
return(pp$data) 
} 
mtcars %>% 
    {ggplot() + geom_point(aes(cyl, mpg))} %>% ggpass() %>% 
    {ggplot() + geom_point(aes(mpg, cyl))}