R Shiny 仪表板 - 如何使用选择框以交互方式为散点图选择 x 和 y 轴?

问题描述

我想构建一个交互式散点图,其中可以根据数据框中的列使用选择框选择 x 和 y 轴。

这是使用 mtcars 的示例 - 我使用 colnames(mtcars) 来获取两个选择框的值。但我收到以下错误: ".subset2(x,"impl")$defineOutput 中的错误:scatter 的意外 gg 输出 Unexpected ggplot 输出的 scatter"

我做错了什么? colnames(mtcars) 有问题吗?

library(shiny)
library(shinydashboard)
library(ggplot2)


ui <- dashboardPage(
  dashboardHeader(),dashboardSidebar(),dashboardBody(
    fluidRow(
      Box(selectInput("scat_x",label = h2("select x-axis"),choices = colnames(mtcars)),selectInput("scat_y",label = h2("select y-axis"),choices = colnames(mtcars))),Box(plotOutput("scatter",height = 250))
    )
    
  )
)

server <- function(input,output) {
  output$scatter<- ggplot(mtcars,aes(x=input$scat_x,y=input$scat_y)) + 
    geom_point()
}
  

shinyApp(ui,server)

解决方法

  1. 要输出 ggplot,您需要将 ggplot 对象包裹在 renderPlot({})
  2. 您需要使用 aes_string,因为您要将列名作为字符串传递给 ggplot。
library(shiny)
library(shinydashboard)
library(ggplot2)


ui <- dashboardPage(
    dashboardHeader(),dashboardSidebar(),dashboardBody(
        fluidRow(
            box(selectInput("scat_x",label = h2("select x-axis"),choices = colnames(mtcars)),selectInput("scat_y",label = h2("select y-axis"),choices = colnames(mtcars))),box(plotOutput("scatter",height = 250))
        )
        
    )
)

server <- function(input,output) {
    output$scatter<- renderPlot({
        ggplot(mtcars,aes_string(x=input$scat_x,y=input$scat_y)) + geom_point()
    })
}


shinyApp(ui,server)