能够指定 ggplot 美学功能,应该 return 一个 ggplot 对象

Ability to specify ggplot aesthetics to function that should return a ggplot object

我正在尝试构造一个行为类似于 ggplot 函数的函数,以及 returns 一个 ggplot 对象,其他函数可以进一步处理(添加方面、应用主题等)。

我现在面临的障碍是我无法让传递给函数的参数像我期望的那样工作。

data(iris)
te <- function(data,x,y){

  g <- ggplot(data,aes_q(x=quote(x),y=quote(y))) + scale_x_continuous() + 
  scale_y_continuous() + geom_point()
  return(g)

}
te(iris,x=Species,y=Petal.Length)

我得到的是:

Error: geom_point requires the following missing aesthetics: x, y

我希望这能让我传递参数而不是字符串,但显然我在这里做错了。对我来说,奇怪的是 geom_point 是抱怨的功能。怎么会?

调用函数时尝试quote

data(iris)
library(ggplot2)
te <- function(data,x,y){
  g <- ggplot(data,aes_q(x,y)) + scale_x_continuous() + 
    scale_y_continuous() + geom_point()
  return(g)

}
te(iris,x=quote(Species),y=quote(Petal.Length))

在函数内部你需要使用 substitute 而不是 quote:

data(iris)
te <- function(data,x,y){
  
  x <- substitute(x)
  y <- substitute(y)
  g <- ggplot(data,aes_q(x=x,y=y)) + scale_x_discrete() + 
    scale_y_continuous() + geom_point()
  return(g)
  
}
te(iris,x=Species,y=Petal.Length)

这会很完美。

P.S。我将 scale_x_continuous 更改为 scale_x_discrete 因为物种是离散的