rsoren
rsoren

Reputation: 4216

Counter that increments each second and updates a plot, in R Shiny

I'm trying to create a timed counter within a Shiny app. When it increments each second, it should refresh a plot with some new characteristic that depends on the counter. Here's an example based on the 'Old Faithful' app. It doesn't work, but it gets at the idea. I tried to have reactiveTimer() refresh the plot, and a counter recorded with reactiveValues().

server.R

library(shiny)

shinyServer(function(input, output) {

  refreshPlot <- reactiveTimer(intervalMs = 1000)
  vals <- reactiveValues(counter = 0)

  output$distPlot <- renderPlot({

    refreshPlot()
    vals$counter <- isolate(vals$counter) + 1

    # generate bins based on input$bins from ui.R
    x    <- faithful[, 2]
    n_bins <- input$bins + vals$counter
    bins <- seq(min(x), max(x), length.out = n_bins)

    # draw the histogram with the specified number of bins
    hist(x, breaks = bins, col = 'darkgray', border = 'white')

  })

})

ui.R

library(shiny)

shinyUI(fluidPage(

  # Application title
  titlePanel("Old Faithful Geyser Data"),

  # Sidebar with a slider input for number of bins
  sidebarLayout(
    sidebarPanel(
      sliderInput("bins",
                  "Number of bins:",
                  min = 1,
                  max = 50,
                  value = 30)
    ),

    # Show a plot of the generated distribution
    mainPanel(
      plotOutput("distPlot")
    )
  )

Upvotes: 1

Views: 693

Answers (1)

rsoren
rsoren

Reputation: 4216

invalidateLater is what I'm looking for. Thanks, Dieter. Below is the server.R that works.

library(shiny)

shinyServer(function(input, output, session) {

  vals <- reactiveValues(counter = 0)

  output$distPlot <- renderPlot({

    invalidateLater(millis = 1000, session)
    vals$counter <- isolate(vals$counter) + 1

    # generate bins based on input$bins from ui.R
    x    <- faithful[, 2]
    n_bins <- input$bins + vals$counter
    bins <- seq(min(x), max(x), length.out = n_bins)

    # draw the histogram with the specified number of bins
    hist(x, breaks = bins, col = 'darkgray', border = 'white')

  })

})

Upvotes: 5

Related Questions