为什么我必须在闪亮的 ggplot 中使用 aes_string()?

Why do I have to use aes_string() with ggplot in shiny?

我是 shiny 的新手,我正在尝试制作 ggplot。根据我的阅读,我必须使用 aes_string 而不是 aes(),但我仍在尝试找出原因。

我的代码:

output$scatterplot <- renderPlot({
    ggplot(data = movies, aes_string(x = input$x, y = input$y,
                                     color = input$z)) +
      geom_point(alpha = input$alpha)
  })

我们以mtcars数据为例

通常你称ggplot2为:

library(ggplot2)
ggplot(data = mtcars, aes(x = mpg, y = disp,color = am)) + geom_point()

请注意,您将 mpgdispam 作为裸列名称而不是字符串传递。当您在 shiny 中接受用户输入时,您会得到这些字符串。因此,如果您不使用 aes_string,那么您所调用的是:

ggplot(data = mtcars, aes(x = "mpg", y = "disp",color = "am")) + geom_point()

这不是你想要的。因此,通过使用 aes_string 你“告诉”R/Shiny 我将列名作为字符串传递,但将它们视为数据框中的列而不是字符串。

另请注意,aes_string 已 soft-deprecated,建议使用 .data 进行整洁评估,如@Phil 所述。

ggplot(data = mtcars, 
       aes(x = .data[["mpg"]], y = .data[["disp"]],color = .data[["am"]])) + 
  geom_point()

其他选项包括:

  • sym!! :
ggplot(data = mtcars, 
     aes(x = !!sym("mpg"), y = !!sym("disp"),color = !!sym("am"))) + 
     geom_point()
  • get :
ggplot(data = mtcars, 
       aes(x = get("mpg"), y = get("disp"),color = get("am"))) + 
  geom_point()