h.l.m
h.l.m

Reputation: 13465

eventReactive in shiny doesn't update data

In my below example, once run in RStudio, by clicking on the "play" button on the slider, the number of rows displaced gradually increases. But by pausing, and then changing the data set name to iris, then clicking the button "Show" and re-clicking "play", the same animated increase in number of rows does not occur...why? and how do i adjust my code to do so...i.e. let the animation occur with a different data set?

The example below is partially adapted from the eventReactive() function

require(shiny)
if (interactive()) {
  ui <- fluidPage(
    column(4,
           sliderInput('x',label='Num Rows',min=2,max=30,step=1,value=3,animate = TRUE),
           textInput('tbl_nm',label='Data Set',value='cars'),
           br(),
           actionButton("button", "Show")
     ),
     column(8, tableOutput("table"))
   )
   server <- function(input, output) {

    # reactively adjust the number of rows
    ll <- eventReactive(input$x,{
      input$x
    })


    # change the data sets after clicking the button
    dat <- eventReactive(input$button,{
       if(input$tbl_nm=='cars'){
         dat <- cars
      } else {
         dat <- get(input$tbl_nm)
      }
      return(dat)
     })

    # Take a reactive dependency on input$button, but
    # not on any of the stuff inside the function
    df <- eventReactive(input$button, {
       yy <- ll()
      # choose only the relevant data...
      head(dat(),yy)
    })

    # show the final table
    output$table <- renderTable({

      if(input$button==0){
        # show the first few lines of cars at the begining
        head(cars, ll())
      } else {
        # show the selected data
        df()
      }

    })
  }


  shinyApp(ui=ui, server=server)
}

Upvotes: 1

Views: 6155

Answers (1)

Chris
Chris

Reputation: 6362

The reason this is happening is:

output$table <- renderTable({

  if(input$button==0){
    # show the first few lines of cars at the begining
    head(cars, ll())
  } else {
    # show the selected data
    df()
  }

})

Every time a button is pressed, its value (input$button) increments by one. It is only 0 when the app opens. Therefore, head(cars, ll()) only runs before the button is pressed the first time. Afterwards, input$button increments and its value is 2, 3, 4, ... etc.

ll() is an event reactive that depends on input$x (your slider). Therefore, when your slider updates, or when the play sign is pressed, ll() updates, and your table redisplays.

For every time after the first press, df() runs instead. This is an event reactive that depends on input$button - it only runs when the button is pressed. Your table is prevented from updating until the button is pressed.

To fix this, you can use:

df <- eventReactive(input$button | input$x, {
  yy <- ll()
  # choose only the relevant data...
  head(dat(),yy)
})

as your df() instead. It will now update if the button is pressed or if the slider updates

Upvotes: 4

Related Questions