Home > Blockchain >  What's wrong with this Shiny code? Ggplot does not render, dropdown menu does
What's wrong with this Shiny code? Ggplot does not render, dropdown menu does

Time:06-15

I am learning how to use Shiny, and I tried to create a very simple barchart in ggplot2, with a dropdown menu, that allows the user to select a class from a school using the dropdown, and it is supposed to create a barchart with exam result percentages on the y-axis and names on the x-axis. The code I have is as follows:

ui = fluidPage(selectInput(inputId = "Class", label = "Pick a Class", choices = levels(fulldata$Class), plotOutput("bar"), multiple = FALSE, selectize = FALSE))

server = function(input, output){
  
  output$bar = renderPlot({
    plotdata = reactive({data %>% filter(Class == input$Class)})
    ggplot(plotdata(), aes(x = Name, y = Percent_full)   geom_bar())
    })
  }
shinyApp(ui = ui, server = server)

The end result correctly renders the dropdown menu, but it does not render the plot whatsoever. I have tried changing the ggplot call to a simple hist(rnorm(1000)) but it does not render either.

CodePudding user response:

I solved the problem: the plotOutput function in the fluidPage function was defined as an argument of the input function, not as an argument of fluidPage. It works now!

CodePudding user response:

It might be that your code needs to declare the reactive data before you create your ggplot.

Try this:

plotdata = reactive(
data %>% filter(Class == input$Class)
)

output$bar = renderPlot({
    ggplot(plotdata(), aes(x = Name, y = Percent_full)   geom_bar())
})

Here is more example code from a functioning shiny app using reactive data for ggplot:

data <- reactive(
  merged_clean_data %>% filter(between(date, as.POSIXct(input$dateRange[1]),
                   as.POSIXct(input$dateRange[2])))
)  
 #Output plot for any selected variable
    output$timePlot <- renderPlot({
      ggplot(data(), aes(x = date, !!input$selection))  
        theme_classic()   geom_line()  
        coord_cartesian(xlim = as.POSIXct(ranges$x, origin = "1970-01-01"), expand = FALSE)  
        theme(text = element_text(size = 16), axis.title.x=element_blank(), axis.text.y = element_text(angle=90, vjust=1, hjust=1))   {if(input$hlineadd)geom_hline(yintercept = input$hline)}   
        {if(input$smoothingadd)geom_smooth()} 
    }, res = 80)
  • Related