Search code examples
rshiny

Shiny app plot related question -reactive


I am having two columns in my data frame, one is "all_pass" which contains numeric values and other is "st_name" which contains string values name of states

The requirement of the plot is, when user give input of the state it will show the plot of that particular state which contains all_pass numbers

Following is the code in which I am trying to plot, where the user will input the name of the state and as per the input of the state name, the graph will plot as per the all_pass as per the related pass scores to that particular state.

Code is as mentioned below:

library(ggplot2)

library(plotly)
library(dplyr)

library(shiny)



ui <- basicPage(
  h1("Total bills passed by state delegation , 110th Congress"),
  selectizeInput(inputId = "bins",label = "Choose State",
    choices = list("AK","AL","AR","AS","AZ","CA","CO","CT","DC","DE","FL","GA","GU","HI","IA","ID","IL","IN","KS","KY","LA","MA","MD","ME","MI","MN","MO","MS","MT","NC","NE","ND","NH","NJ","NM","NV","NY","OH","OK","OR","PA","PR","RI","SC","SD","TN","TX","UT","VA")  ,multiple = TRUE ,plotOutput("plot"))
  
  )
  

server <- function(input, output) {

  data <- reactive({
    require(input$bins)
    df <- df7 %>% filter(st_name %in% input$bins)
  })
    output$plot <- renderPlot({
      ggplot(df(), aes(y= all_pass,x=st_name ))+geom_bar(stat = "sum")
         })
}


shinyApp(ui = ui, server = server)

Solution

    1. in the UI definition you have plotOutput("plot") as an argument to selectizeInput() instead of basicPage(). Reformatting your code (Ctrl+Shift+A) would have made that more visible.
    2. You can simplify the server code, as the renderPlot() already creates a reactive dependence on input$bins.
    3. You can use the object datasets::state.abb to get a vector of US state abbreviations. This is loaded automatically in every R session.

    Please see some working code below. I am using some mock data for df as you did not provide any data in your question.

    library(ggplot2)
    library(plotly)
    library(dplyr)
    library(shiny)
    
    ui <- basicPage(
      h1("Total bills passed by state delegation, 110th Congress"),
      selectizeInput(inputId = "bins",
                     label = "Choose State",
                     choices = state.abb,
                     multiple = TRUE),
      plotOutput("plot")
      
    )
    
    server <- function(input, output) {
      
      df <- 
        tibble(all_pass = sample(1:500, 350),
               st_name = rep(state.abb, 7))
    
      output$plot <- renderPlot({
        req(input$bins)
        df |> 
          filter(st_name %in% input$bins) |> 
          ggplot(aes(y = all_pass,x=st_name )) + 
          geom_bar(stat = "sum")
      })
    }
    
    
    shinyApp(ui = ui, server = server)