为什么包含参数的 'if' 语句在 ggplot geom 中不起作用?

Why do 'if' statements including arguments don't work in ggplot geoms?

为什么以下方法不起作用?

ggplot(mtcars,aes(x=wt,y=mpg)) +
  geom_smooth({if (T) ("colour='red'")})

ggplot(mtcars,aes(x=wt,y=mpg)) +
  geom_smooth(ifelse(T,("colour='red'")))

ggplot(mtcars,aes(x=wt,y=mpg)) +
  geom_smooth(switch(T,("colour='red'")))

他们都这样输出:

Error: `mapping` must be created by `aes()`

有什么解决方法?

编辑:

建议的答案建议将 if 语句放在命名的 colour 参数之后。问题是,即使我保留 color=NANULL 或空白,如果 aes(colour) 已经定义,它也会发生冲突,因此它不等同于根本没有参数。 这确实是我想要达到的 problem/workaround。 例如:

ggplot(mtcars,aes(x=wt,y=mpg,colour=factor(cyl))) + geom_smooth(colour = NA) 不会产生三个彩色线条(如果 aes() 会接管,它应该会接管,表明它正在被覆盖)

设置 geom_smooth(color = NULL) 给出:Error: Aesthetics must be either length 1 or the same as the data (80): colour

设置 geom_smooth(color = ) 给出:Error in geom_smooth(color = ) : argument is missing, with no default

注意:Gregory 还建议复制 geom 语句, 一个可行的解决方法,但我的问题最终是关于 'is there a way to avoid doing precisely this'(复制调用 geoms_) 并试图理解 为什么 我们不允许使用包含参数的 if 语句。

编辑 2:

我提出这个问题的初衷是关于 为什么 ggplot2 的编码方式不允许条件语句在 geom 中包含完整的可选参数(例如,在某些情况下会发生冲突或产生错误吗?)。 Yifu Yan 最初对这个问题提出了一个有希望的答案,他说“颜色是一个命名参数,它必须有一个名字”,尽管我会更欣赏 elaboration/explanation

我目前的理解是,如果不重复调用 geom,可能无法做我想做的事。但是,我一直在寻找的函数示例(不重复调用 geoms)是:

scatterfun <- function (Data,Predictor,Response,has.Groups,Group.variable) {
  ggplot(Data,aes(x={{Predictor}},y={{Response}})) +
    geom_smooth(switch(has.Groups + 1,("colour='red'"),
                       aes(colour={{Group.variable}})))
}

has.Groups = TRUE

时有效
scatterfun(mtcars,wt,mpg,T,factor(cyl))

(如您所见,我想保留置信区间)

但在 has.Groups = FALSE:

时不起作用
scatterfun(mtcars,wt,mpg,F,factor(cyl))

Error: `mapping` must be created by `aes()`

因此,对于这个问题,当我想有条件地向 geom 语句添加单色时,我试图更好地理解该部分(这就是为什么我在问题的开头将这部分分开)。希望现在更清楚了。

场景 1

如果您想要三行或一行:

condition <- TRUE
ggplot(mtcars,aes(x=wt,y=mpg,colour=factor(cyl))) + 
    {
        if ( condition ){
            geom_smooth() 
        } else {
            geom_smooth(color = "black")
        }
    }

condition <- FALSE
ggplot(mtcars,aes(x=wt,y=mpg,colour=factor(cyl))) + 
    {
        if ( condition ){
            geom_smooth() 
        } else {
            geom_smooth(color = "black")
        }
    }

场景 2

需要说明的是,您始终需要为每个组设置三个单独的回归线。但是,与此同时,您还想为数据创建一条条件回归线,而不考虑组。

condition <- TRUE
ggplot(mtcars,aes(x=wt,y=mpg,colour=factor(cyl))) + 
    geom_smooth(se = FALSE) +
    geom_smooth(colour = if (condition) "black" else NA,se = FALSE)

library(ggplot2)
condition <- FALSE
ggplot(mtcars,aes(x=wt,y=mpg,colour=factor(cyl))) + 
    geom_smooth(se = FALSE) +
    geom_smooth(colour = if (condition) "black" else NA,se = FALSE)

您可以创建一个独立函数,有条件地添加红色平滑或默认平滑。

library(ggplot2)

smooth_condition <- function (x) {
  return(
    if (x) {
      geom_smooth(color = 'red')
      } else {
      geom_smooth()
      }
    )
}

ggplot(mtcars, aes(x = wt, y = mpg)) +
  smooth_condition(TRUE)

ggplot(mtcars, aes(x = wt, y = mpg)) +
  smooth_condition(FALSE)