2016-11-16 48 views
2

我想用magrittr的管道在ggplot對象上定義一個自定義函數。但是,我不能將一個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

您可以嘗試定義不期望繪圖對象的函數,只需按照ggplot中的慣常方法添加它即可。

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


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

哦,我沒想到解決方案如此簡單:) – janosdivenyi

+1

通過返回geom或其他ggplot函數列表,您甚至可以從my_plot()中獲取多個geom。 –