我的 Shiny 应用程序生成了一些用户可以下载的文件。为此,我已经在ui中放置了downloadbutton。但是,当页面启动时并且在进行任何计算之前,没有可供下载的内容。我想防止用户下载空白页。

为此,我正在考虑在输出准备好之前禁用downloadButton。但是我不知道该怎么做。我已经找到了禁用ActionButton的方法(例如ShinyBS包和其他JS代码),但对于downloadButton却一无所获。

现在,如果输出未准备好,我将使用validate()引发错误。但是,单击downloadButton时,将打开一个新的空网页,其中包含一条错误消息,非常丑陋。

让我知道你的想法。

这是我的用户界面代码

 downloadButton('download', 'Download Lasso component matrix')),

这是我的服务器代码:
  output$download_matrix <- downloadHandler(
      filename = function() {
      validate(
      need(is.null(outputData())==FALSE, "No data to download yet")
      )
      paste('combined_model_matrix', '.txt', sep='') },
    content = function(file) {
      write.csv(outputData()$combinedAdjMtr, file)
})

最佳答案

根据您的评论:



假设操作按钮名为input$start_proc

在server.R中:

shinyServer(function(input, output, session) {
   #... other code
   observe({
       if (input$start_proc > 0) {
           # crunch data...
           # when data is ready:
           session$sendCustomMessage("download_ready", list(...))
           # you can put extra information you want to send to the client
           # in the ... part.
       }
   })
   #... other code
})

然后,在 ui.R 中,您可以编写一些JavaScript来处理自定义消息事件。

一个完整的例子是:

服务器
library(shiny)

fakeDataProcessing <- function(duration) {
  # does nothing but sleep for "duration" seconds while
  # pretending some background task is going on...
  Sys.sleep(duration)
}

shinyServer(function(input, output, session) {

  observe({
    if (input$start_proc > 0) {
      fakeDataProcessing(5)
      # notify the browser that the data is ready to download
      session$sendCustomMessage("download_ready", list(fileSize=floor(runif(1) * 10000)))
    }
  })

  output$data_file <- downloadHandler(
       filename = function() {
         paste('data-', Sys.Date(), '.csv', sep='')
       },
       content = function(file) {
         write.csv(data.frame(x=runif(5), y=rnorm(5)), file)
       }
  )
})

用户界面
library(shiny)

shinyUI(fluidPage(
  singleton(tags$head(HTML(
'
  <script type="text/javascript">
    $(document).ready(function() {
      // disable download at startup. data_file is the id of the downloadButton
      $("#data_file").attr("disabled", "true").attr("onclick", "return false;");

      Shiny.addCustomMessageHandler("download_ready", function(message) {
        $("#data_file").removeAttr("disabled").removeAttr("onclick").html(
          "<i class=\\"fa fa-download\\"></i>Download (file size: " + message.fileSize + ")");
      });
    })
  </script>
'
))),
  tabsetPanel(
    tabPanel('Data download example',
      actionButton("start_proc", h5("Click to start processing data")),
      hr(),

      downloadButton("data_file"),
      helpText("Download will be available once the processing is completed.")
    )
  )
))

在该示例中,等待5秒钟会伪造数据处理。
然后,下载按钮将准备就绪。我还在消息中添加了一些“假” fileSize信息,以演示如何向用户发送额外的信息。

请注意,因为Shiny将actionButton实现为<a>标记而不是<button>,并且在其上绑定(bind)了click事件。因此,为了完全禁用它,除了添加disabled属性以使其看起来已禁用之外,您还需要通过添加内联click属性来覆盖其onclick事件。否则,用户仍然可以不小心单击(似乎已禁用)下载按钮并触发下载。

关于javascript - Shiny 的应用程序: disable downloadbutton,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25247852/

10-11 13:01