Search code examples
rshinyflexdashboard

How to render ggplot chart when button update is pressed?


I would like to have this chart to rerender only when I press on button updt. This is the code I have so far

---
title: ""
author: 
output: 
  flexdashboard::flex_dashboard:
    storyboard: true

runtime: shiny
---


```{r setup, include=FALSE}
library(flexdashboard)
library(ggplot2)
library(dplyr)
```

Column {data-width=650}
-----------------------------------------------------------------------

### Chart A

```{r}
actionButton('updt', 'Update chart')
checkboxGroupInput('gear', 'number of gears', unique(mtcars$gear), (mtcars$gear))
observeEvent( eventExpr = input$updt , handlerExpr = {
  renderPlot({
    dd <- mtcars %>% filter(gear %in% input$gear)
    f1 <- ggplot(aes(mpg, disp), data=dd) + geom_point()
    f1
  })

})

```

Solution

  • According to ?observeEvent:

    observeEvent returns an observer reference class object

    This can not be plotted.

    You could do something like:

    observeEvent( eventExpr = input$updt , handlerExpr = {
      output$myplot <- renderPlot({
        dd <- mtcars %>% filter(gear %in% isolate(input$gear))
        f1 <- ggplot(aes(mpg, disp), data=dd) + geom_point()
        f1
      })
    })
    plotOutput("myplot")
    

    but still you have to isolate(input$gear) as output$myplot is reactive to input$gear

    So the best is to remove the observeEvent, add req(input$updt) to make renderPlot reactive to it and isolate(input$gear):

    renderPlot({
        req(input$updt)
        dd <- mtcars %>% filter(gear %in% isolate(input$gear))
        f1 <- ggplot(aes(mpg, disp), data=dd) + geom_point()
        f1
      })