【发布时间】:2017-03-30 22:39:17
【问题描述】:
我想使用在带有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() 而不是绘图本身。我怎么能用管道传递情节?
【问题讨论】:
-
您无法更改 R 中的运算符优先级,因此唯一的方法是将 ggplotting 内容放在括号中的
%>%s 之间。不过,这可能不是您想要的。 -
@KonradRudolph 你的意思是
mtcars %>% (ggplot() + geom_point(aes(mpg, wt))) %>% my_plot_function()?它似乎不起作用。 -
我的意思是
(mtcars %>% ggplot() + geom_point(aes(mpg, wt))) %>% my_plot_function()(有效),但我的第一条评论中的描述是错误的,并且暗示了您编写的代码。 -
@Konrad 您无法更改运算符优先级,但您可以使用具有正确优先级的运算符,方法是定义
-.gg或覆盖+.gg -
@Moody_Mudskipper 当然可以。但是定义一个新的操作符并不能完全使代码直观易懂,而用不同的语义覆盖
+.gg会更糟,因为它会主动做一些与预期不同的事情。