如何将多个ggplot2元素组合到函数的返回中?

bri*_*ndk 25 r ggplot2

如果我尝试手动编写ggplot2绘图的某些元素,它可以正常工作:

> p <- ggplot(aes(x = mpg, y = hp), data = mtcars)
> p + geom_vline(xintercept = 20) + geom_point(data = mtcars)
Run Code Online (Sandbox Code Playgroud)

但是如果我尝试将一些组合捆绑到一个函数中,我会收到一个错误:

> myFunction <- function() {
+   return(
+     geom_vline(xintercept = 20) + geom_point(data = mtcars)
+   )
+ }
> p <- ggplot(aes(x = mpg, y = hp), data = mtcars)
> p + myFunction()
Error in geom_vline(xintercept = 20) + geom_point(data = mtcars) : 
  non-numeric argument to binary operator
Run Code Online (Sandbox Code Playgroud)

ggplot2是否因为ggplot2在函数体中正确组合元素而在符号中遗漏了一些东西?

koh*_*ske 48

ggplot2支持元素的"列表":

myFunction <- function()
 list(geom_vline(xintercept = 20),
      geom_point(data = mtcars))

p <- ggplot(aes(x = mpg, y = hp), data = mtcars)
p + myFunction()
Run Code Online (Sandbox Code Playgroud)

您可以在列表中保留ggplot2函数返回的任何部分,包括labs(),opts()等,然后使用"+"表示绑定ggplot2基础层和列表中的部分.

可能这个功能并不广为人知,但是当有人想重新使用一个元素时,这个功能非常有用.

  • 关于这个问题,请参阅Hadley的精彩教程(2015年中):https://rpubs.com/hadley/97970 (2认同)