Philipp R
Philipp R

Reputation: 615

download count in shinyapps.io

I have set up a shiny app that knitr's markdown PDF's based on selceted data. The generated report needs to have some sort of unique ID to be referenced in meetings. I understand that I can use the session ID but I need a way to count the downloads per session. Is there a way of counting events outside sessions or counting the number of session ID's since first deployment?

Upvotes: 1

Views: 450

Answers (1)

Mike Wise
Mike Wise

Reputation: 22817

I needed to do that once, so I had some code lying around. It basically kept track of everything in a csv that I appended to. Here I built it into a shiny test platform.

  • it uses the session$token for the id (maybe there is something better)
  • it uses write.table and read.table because they behave better with the append option.
  • it increments the count by calling out to writetolog in the shiny download handler but you can also increment the count manually with an extra button (which is only for test purposes obviously)
  • It has two output, one is a summary of the log, the other is a dump of what is in the log. These are for debugging as the downloadHandler can be a bit "challenging" at times when interacting with all this reactivity.

Here is that code modified to be an example like about what you need:

library(shiny)

logfname <- "log.csv"
writetolog <- function(newcount,newsessionid,operation){
  time <- format(Sys.time(), "%Y-%m-%d %H:%M:%S %Z")
  df <- data.frame(time=time,count=newcount,sessionid=newsessionid,operation=operation)
  doappend <- file.exists(logfname)
  if (doappend){
    write.table(df,logfname,append=T,quote=F,col.names=F,sep=",",row.names=F)
  } else {
    write.table(df,logfname,append=F,quote=F,sep=",",row.names=F)
  }
}
getcounts <- function(){
  if (!file.exists(logfname)){
    return(list(count=0,sessioncount=0))
  }
  df <- read.table(logfname,header=T,sep=",")
  nr <- nrow(df)
  rlst <- list(count=sum(df$count),sessioncount=length(unique(df$sessionid)),                                    
                lastop=df$operation[nr],lasttime=df$time[nr])
  return(rlst)
}

ui <- fluidPage(
  titlePanel("Keep a download log"),
  sidebarLayout(
    sidebarPanel(
      actionButton("inccount","Increment Count"),
      actionButton("getcount","Refresh Summary"),
      actionButton("showlog","Show Log"),
      downloadButton("dodownload", "Save to .csv")
    ),
    mainPanel(
      h2("Summary of Download Log"),
      verbatimTextOutput("showcount"),
      h2("Dump of Download Log"),
      verbatimTextOutput("loglog")
    )
  )
)

server <- function(input, output,session) {
  observeEvent(input$inccount,{
    print("writetolog")
    writetolog(1,session$token,"inc count")
  })

  output$showcount <- renderPrint({
    input$getcount
    rv <- getcounts()
    time <- format(Sys.time(), "%Y-%m-%d %H:%M:%S %Z")
    print(sprintf("%s   -  count:%d sessioncount:%d",time,rv$count,rv$sessioncount))
  })
  output$loglog <- renderPrint({
    input$showlog
    if (!file.exists(logfname)) return(NULL)
    ldf <- read.csv(logfname)
    print(ldf)
  })

  output$dodownload<-downloadHandler(        
    filename = function() {
      paste(input$table_name, '.csv', sep='')
    },
    content = function(file) {
      write.csv(mtcars, file)
      writetolog(1,session$token,"save file")
    }
  )
}
shinyApp(ui = ui, server = server)

Screen shot:

enter image description here

Upvotes: 1

Related Questions