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

Die*_*rto 1 r ggplot2 shiny shiny-reactivity

我\xc2\xb4m 新使用shiny 和I\xc2\xb4m 尝试制作ggplot。根据我所读到的内容,我必须使用aes_string代替aes(),但我仍在试图找出原因。

\n

我的代码:

\n
output$scatterplot <- renderPlot({\n    ggplot(data = movies, aes_string(x = input$x, y = input$y,\n                                     color = input$z)) +\n      geom_point(alpha = input$alpha)\n  })\n
Run Code Online (Sandbox Code Playgroud)\n

Ron*_*hah 7

让我们以mtcars数据为例。

通常您可以ggplot2这样称呼:

library(ggplot2)
ggplot(data = mtcars, aes(x = mpg, y = disp,color = am)) + geom_point()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

请注意,您将mpg,dispam作为裸列名称传递,而不是作为字符串传递。当您以闪亮的方式获取用户输入时,您会得到这些字符串。因此,如果您不使用aes_string您所调用的内容:

ggplot(data = mtcars, aes(x = "mpg", y = "disp",color = "am")) + geom_point()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

另请注意,它aes_string已被软弃用,建议使用.data@Phil 提到的整洁评估。

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

其他选项包括:

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