首页 > 解决方案 > 为什么我必须在闪亮的 ggplot 中使用 aes_string()?

问题描述

我是闪亮的新手,我正在尝试制作一个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)
  })

标签: rggplot2shinyshiny-reactivity

解决方案


让我们以mtcars数据为例。

通常你调用ggplot2为:

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

在此处输入图像描述

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

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

在此处输入图像描述

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

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

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()

推荐阅读