2016-11-16 3 views
2

Я хотел бы использовать пользовательскую функцию, определенную на объекте ggplot, с помощью трубы magrittr. Однако я не могу передать объект ggplot в эту функцию.Как перенести объект ggplot?

Вот простой пример:

library(ggplot2) 
library(magrittr) 

my_plot_function <- function(plot) { 
    plot + geom_hline(yintercept = 3, linetype = 'dashed') 
} 

data(mtcars) 
p <- mtcars %>% 
    ggplot() + 
    geom_point(aes(mpg, wt)) 
my_plot_function(p) 

Было бы замечательно, если бы я мог бы использовать my_plot_function() в цепи следующим образом:

mtcars %>% 
    ggplot() + 
    geom_point(aes(mpg, wt)) %>% 
    my_plot_function() 

Однако он дает ошибку, как только слой передается на my_plot_function() вместо самого сюжета. Как я могу передать сюжет с трубой?

+0

Вы не можете изменить приоритет оператора в R, поэтому единственный способ сделать эту работу - поместить материал ggplotting между '%>%' в круглых скобках. Это, вероятно, не то, что вы хотите. –

+0

@ KonradRudolph Вы имеете в виду 'mtcars%>% (ggplot() + geom_point (aes (mpg, wt)))%>% my_plot_function()'? Кажется, это не работает. – janosdivenyi

+0

Я имел в виду '(mtcars%>% ggplot() + geom_point (aes (mpg, wt)))%>% my_plot_function()' (который работает), но описание в моем первом комментарии было неправильным и подразумевало бы код, который вы написал. –

ответ

3

Вы можете попытаться определить функцию, которая не ожидает объекта plot, и просто добавьте его, как обычно в ggplot.

my_plot_function <- function() { 
    geom_hline(yintercept = 3, linetype = 'dashed') 
} 


mtcars %>% 
    ggplot() + 
    geom_point(aes(mpg, wt)) + my_plot_function() 
+0

О, я не ожидал, что решение будет таким простым :) – janosdivenyi

+1

Вы можете даже иметь несколько геометрий из my_plot(), возвращая список геометрий или других функций ggplot. –