根据搜索按钮在 Shiny Dashboard 中过滤 ggplot 图表

问题描述

下面是可重现的代码

# DF
branch <- c("north","South","north","north")
cars <- c("Toyota","Nissan","BMW","Ford","Toyota","Nissan")
insured <- c("Yes","Yes","No","No")
price <- c(21000,23400,26800,21000,21000)
salesDF <- data.frame(branch,cars,insured,price)
carBranch <- unique(salesDF$branch)



library(shiny)
library(DT)
library(shinydashboard)
library(plotly)
library(tidyverse)

# Define UI for application that draws a histogram
ui <- fluidPage(
  
  # Application title
  titlePanel("Car Sales"),# Sidebar with the selectInput Slider
  sidebarLayout(
    
    sidebarMenu(
      sidebarSearchForm(textId = "Search",buttonId = "search Car",label = "Search Town")
    ),# Show the DataTable
    mainPanel(
      Box(title = "Car Sales",width = 7,height=NULL,solidHeader = T,status = "warning",plotlyOutput("carBranch"))
    )
  )
)

# Define server logic required to draw a histogram
server <- function(input,output) {
  
  output$carBranch <- renderPlotly({
    ggplot(salesDF,aes(branch,insured)) + 
      geom_bar(stat = "identity")
  })
  
}

# Run the application 
shinyApp(ui = ui,server = server)

如何根据对特定汽车的搜索来制作绘图过滤器?

解决方法

也许你正在寻找这个

 Define UI for application that draws a histogram
ui <- fluidPage(

  # Application title
  titlePanel("Car Sales"),# Sidebar with the selectInput Slider
  sidebarLayout(

    sidebarMenu(
      sidebarSearchForm(textId = "Search",buttonId = "search Car",label = "Search Town"),selectInput("mycar","Choose a Car",choices=unique(salesDF$cars))
    ),# Show the DataTable
    mainPanel(
      box(title = "Car Sales w/ selectInput",width = 6,height=NULL,solidHeader = T,status = "warning",plotlyOutput("carBranch",width=400)),box(title = "Car Sales w/ SearchForm",status = "success",plotlyOutput("carBranch2",width=400))
    )
  )
)

# Define server logic required to draw a histogram
server <- function(input,output) {

  output$carBranch <- renderPlotly({
    ggplot(salesDF[salesDF$cars %in% input$mycar,],aes(x=branch,y=price,fill=factor(insured))) +
      geom_bar(stat = "identity") + labs(fill="Insured)")
  })
  output$carBranch2 <- renderPlotly({
    req(input$Search)
    df <- salesDF
    df$ucars <- toupper(df$cars)
    if (sum(df$ucars %in% toupper(input$Search))>0) {
      ggplot(df[df$ucars %in% toupper(input$Search),fill=factor(insured))) +
        geom_bar(stat = "identity") + labs(fill="Insured)")
    }else return(NULL)
  })
  
}

# Run the application
shinyApp(ui = ui,server = server)

output