R - count闪亮的下载按钮点击

时间:2017-04-27 16:32:06

标签: 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)

1 个答案:

答案 0 :(得分:4)

我认为没有内置方法。但你可以自己建造它。

您可以通过使用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)};
            ")      
    }
  })

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

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

  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,")};
              ")
        )      
      }
    }
  })

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

   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)