在shinyapps.io下载计数

时间:2017-04-04 01:47:57

标签: r r-markdown shiny

我已根据所选数据设置了一个闪亮的应用程序,即knitr的降价PDF。生成的报告需要具有某种在会议中引用的唯一ID。 我知道我可以使用会话ID,但我需要一种方法来计算每个会话的下载量。 有没有办法计算会话之外的事件或计算自首次部署以来的会话ID数量?

1 个答案:

答案 0 :(得分:1)

我需要做一次,所以我有一些代码。它基本上跟踪了我追加到的csv中的所有内容。在这里,我将它构建成一个闪亮的测试平台。

  • 它使用session$token作为id(可能有更好的东西)
  • 它使用write.tableread.table,因为它们使用append选项表现得更好。
  • 它通过在闪亮的下载处理程序中调用writetolog来增加计数,但您也可以使用额外的按钮手动增加计数(显然仅用于测试目的)
  • 它有两个输出,一个是日志摘要,另一个是日志中的转储。这些用于调试,因为downloadHandler可能有点"挑战"有时与所有这些反应性相互作用。

以下代码被修改为一个类似于你需要的例子:

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)

屏幕截图:

enter image description here