2017-04-04 40 views
1

我已经建立了一个闪亮的应用程序,基于selceted数据knitr的降价PDF的。生成的报告需要在会议中引用某种唯一ID。 我知道我可以使用会话ID,但我需要一种方法来计算每个会话的下载次数。 有没有一种方法可以计算会话之外的事件或计算自首次部署以来会话ID的数量?shinyapps.io下载次数

+0

是什么 –

+0

对不起,我的意思是[https://www.shinyapps.io/](https://www.shinyapps.io/) –

+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) 

屏幕快照: “shinyapp.oi”

enter image description here

+0

在csv中存储会话值是有意义的,并且为唯一ID进行过滤对于下载计数器来说非常合适。我发现'downloadButton'工作在w /'downloadHandler'而不是'actionButton','observeEvent'不会听'downloadButton'或'downloadHandler'。任何想法如何让'observeEvent'听'downloadButton'? –

+0

谢谢加载!完美的作品,但它必须触发'写入(1,会话$令牌)'两次。点击按钮后,点击次数会增加,点击保存时再次点击。 –

+0

当然,你不要在两个地方调用它? –