首页 > 解决方案 > 闪亮的 downloadHandler 等待数据准备好

问题描述

我闪亮的应用程序中的数据需要几秒钟来处理。我有一个下载按钮,我希望它要么在数据准备好之前不可点击,要么让下载处理程序等到准备好。目前在 5 秒前单击下载按钮会返回默认的 html 文件,然后在 5 秒后它会按预期运行。

我目前的解决方案是使用 `shinyjs::hide/show. 我在下面展示了这个。

这是最佳实践吗?另外,为什么shinyjs::useShiny()一开始呢?它似乎对那个包来说是独一无二的。

ui <- fluidPage(
shinyjs::useShiny(),
  shinyjs::hidden(downloadButton("downloadData", "Download"))
)

server <- function(input, output) {
   # Our dataset
  data <- mtcars

if(is.null(mtcars)){shinyjs::hide(“downloadData”)}
else{shinyjs::show(“downloadData”)}

   output$downloadData <- downloadHandler(
     filename = function() {
      paste("data-", Sys.Date(), ".csv", sep="")
     },
     content = function(file) {
      write.csv(data, file)}
  )
}

shinyApp(ui, server)

标签: rshiny

解决方案


您所描述的完全合理,并且过去曾在 stackoverflow 上提出过建议。您也可以使用禁用/启用而不是隐藏/显示,无论您觉得更好的用户体验如何。

useShinyjs() 需要设置所有正在发生的 R <--> JavaScript 通信。没有它,当您尝试从服务器调用 shinyjs 函数时,什么都不会发生,因为 UI 没有使用 javascript 初始化。自从我制作了 shinyjs 以来,其他一些包也采用了这种模式,尤其是也处理 javascript 的包。


推荐阅读