How to count downloads?


#1

My question is closely related to that one.

I need to add a counter for downloads. So I use a reactive value that I want to set inside the ‘content’ argument of the downloadHandler function

An example:

library(shiny)
ui <- fluidPage(
  downloadButton("downloadData", "Download"),
  actionButton("trig", "get number")
)

server <- function(input, output) {
  data <- mtcars
  rnDownloads <- reactiveValues(n=0)

  observe(print(rnDownloads$n))

  observeEvent(input$trig, {
    print(paste("number of downloads:", rnDownloads$n))
  })
  
  output$downloadData <- downloadHandler(
    filename = function() {
      paste("data-", Sys.Date(), ".csv", sep="")
    },
    content = function(file) {
      rnDownloads$n <- rnDownloads$n + 1
      write.csv(data, file)
    }
  )
}

shinyApp(ui, server)

I don’t know whether it’s a bug, but it does not work as I expected: the only way to update the value of the reactiveValue rnDownloads$n is to click on the actionButton.


#2

I can’t tell if this is a bug or not, but a guy in this post offers a solution using Javascript to count button clicks. I hope this is helpful…!!!


#3

This is a bug in Shiny. Can you file it on our GitHub repo, with a link to this thread? The problem is that hitting that URL does not cause Shiny to “flush” the session. It should be an easy fix–thanks for the report.

If you must have this working now, you can add a dummy observer that does nothing but cause the session to flush. You can do this by putting this anywhere in your server function:

observe({
  invalidateLater(500)
})