R-计数闪亮下载按钮的点击次数

Rob*_*bin 3 r button shiny

是否有一个内置的Shiny属性可以计算单击一次downloadButton的次数?我在功能帮助或网络搜索中找不到它。如果没有内置方法,我该如何计算点击次数。这是一个工作示例:

data <- matrix(1:20, nrow=5)
ui <-  fluidPage(title = 'Count Button Clicks',
              fluidRow(style = "padding-bottom: 20px;",
                      column(width=6,
                             textOutput("actionclickCount"),
                             br(),
                             textOutput("downloadclickCount")
                             ),
                      column(width=6,
                             actionButton("actionBtn", "Action Button"),
                             br(),
                             downloadButton("dwnldBtn", "Download Button")
                             )
                      )
             )

server <- function(input, output, session) {
    output$actionclickCount <- renderText({
      paste('Action Button Clicks =',input$actionBtn)
    })

    output$downloadclickCount <- renderText({
      paste('Download Button Clicks =','what variable goes here?')
    })

    output$dwnldBtn <- downloadHandler(
      filename = 'data.csv',
      content = function(file){
        write.csv(data, file)
      },
      contentType = 'csv'
    )
  }

shinyApp(ui = ui, server = server)
Run Code Online (Sandbox Code Playgroud)

Big*_*ist 5

我认为没有内置方法。但是您可以自己构建它。

您可以使用javascript将点击监听器添加到按钮上,以实现此目的:

  observe({
    if(is.null(input$rnd)){
      runjs("
            var click = 0;
            Shiny.onInputChange('rnd', click)
            var dwnldBtn = document.getElementById('dwnldBtn')
            dwnldBtn.onclick = function() {click += 1; Shiny.onInputChange('rnd', click)};
            ")      
    }
  })
Run Code Online (Sandbox Code Playgroud)

来自的输出Shiny.onInputChange('rnd', click)将通过中的Shiny访问input$rnd

编辑:对于多个按钮,您可以使用:

  observe({
    for(btn1 in 1:2){
      if(is.null(input[[paste0("rnd", btn1)]])){
        runjs(
          paste0("
              var counter", btn1 ,"= 0;
              var dwnldBtn = document.getElementById('", paste0("dwnldBtn", btn1), "')
              dwnldBtn.onclick = function() {counter", btn1, " +=1; Shiny.onInputChange('", paste0("rnd", btn1), "', counter", btn1,")};
              ")
        )      
      }
    }
  })
Run Code Online (Sandbox Code Playgroud)

有关工作示例,请参见以下内容:

   library(shiny)
library(shinyjs)
data <- matrix(1:20, nrow=5)

ui <-  fluidPage(title = 'Count Button Clicks',
                 useShinyjs(),
                 fluidRow(style = "padding-bottom: 20px;",
                          column(width=6,
                                 textOutput("actionclickCount"),
                                 br(),
                                 textOutput("downloadclickCount")
                          ),
                          column(width=6,
                                 actionButton("actionBtn", "Action Button"),
                                 br(),
                                 downloadButton("dwnldBtn", "Download Button")
                          )
                 )
)

server <- function(input, output, session) {
  output$actionclickCount <- renderText({
    paste('Action Button Clicks =',input$actionBtn)
  })

  output$downloadclickCount <- renderText({
    paste('Download Button Clicks =', input$rnd)
  })

  output$dwnldBtn <- downloadHandler(
    filename = 'data.csv',
    content = function(file){
      write.csv(data, file)
    },
    contentType = 'csv'
  )

  observe({
    if(is.null(input$rnd)){
      runjs("
            var click = 0;
            Shiny.onInputChange('rnd', click)
            var dwnldBtn = document.getElementById('dwnldBtn')
            dwnldBtn.onclick = function() {click += 1; Shiny.onInputChange('rnd', click)};
            ")      
    }
    })

  }

runApp(shinyApp(ui = ui, server = server), launch.browser = TRUE)
Run Code Online (Sandbox Code Playgroud)