首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用不可见的download按钮启用download all with server = TRUE datatable

使用不可见的download按钮启用download all with server = TRUE datatable
EN

Stack Overflow用户
提问于 2021-08-07 01:13:17
回答 2查看 33关注 0票数 0

目标是支持从数据表下载所有数据,即使在server = TRUE时也是如此。多亏了Github上的this post,我已经非常接近了。

这是可行的:

代码语言:javascript
复制
library(shiny)
library(DT)

callback <- JS(
  "var a = document.createElement('a');",
  "$(a).addClass('dt-button');",
  "a.href = document.getElementById('download1').href;",
  "a.download = '';",
  "$(a).attr('target', '_blank');",
  "$(a).text('Download');",
  "$('div.dwnld').append(a);",
  "$('#download1').hide();"
)

ui <- basicPage(
  downloadButton("download1", ""), # no label: this button will be hidden
  numericInput("nrows", "Number of rows", 10),
  DTOutput("dtable")
)

server <- function(input, output, session){
  output$dtable <- renderDT(
    datatable(iris[1:input$nrows,],
              callback = callback,
              extensions = 'Buttons',
              options = list(
                dom = 'B<"dwnld">frtip',
                buttons = list(
                  "copy"
                )
              )
    )
  )
  
  output$download1 <- downloadHandler(
    filename = function() {
      paste("data-", Sys.Date(), ".csv", sep="")
    },
    content = function(file) {
      write.csv(iris, file)
    }
  )
  
}

shinyApp(ui, server)

问题是,下载按钮在应用程序加载时会短暂可见。如何确保下载按钮始终不可见?

我尝试使用shinyjs::hidden(),但它导致下载失败:

代码语言:javascript
复制
library(shiny)
library(shinyjs)
library(DT)

callback <- JS(
  "var a = document.createElement('a');",
  "$(a).addClass('dt-button');",
  "a.href = document.getElementById('download1').href;",
  "a.download = '';",
  "$(a).attr('target', '_blank');",
  "$(a).text('Download');",
  "$('div.dwnld').append(a);",
  "$('#download1').hide();"
)

ui <- basicPage(
  useShinyjs(),
  hidden(downloadButton("download1", "")), # no label: this button will be hidden
  numericInput("nrows", "Number of rows", 10),
  DTOutput("dtable")
)

server <- function(input, output, session){
  output$dtable <- renderDT(
    datatable(iris[1:input$nrows,],
              callback = callback,
              extensions = 'Buttons',
              options = list(
                dom = 'B<"dwnld">frtip',
                buttons = list(
                  "copy"
                )
              )
    )
  )
  
  output$download1 <- downloadHandler(
    filename = function() {
      paste("data-", Sys.Date(), ".csv", sep="")
    },
    content = function(file) {
      write.csv(iris, file)
    }
  )
  
}

shinyApp(ui, server)

编辑

使用div(style = 'display: none;', ...)也会导致下载失败。

代码语言:javascript
复制
library(shiny)
library(DT)

callback <- JS(
  "var a = document.createElement('a');",
  "$(a).addClass('dt-button');",
  "a.href = document.getElementById('download1').href;",
  "a.download = '';",
  "$(a).attr('target', '_blank');",
  "$(a).text('Download');",
  "$('div.dwnld').append(a);",
  "$('#download1').hide();"
)

ui <- basicPage(
  div(style = "display: none;", downloadButton("download1", "")), # no label: this button will be hidden
  numericInput("nrows", "Number of rows", 10),
  DTOutput("dtable")
)

server <- function(input, output, session){
  output$dtable <- renderDT(
    datatable(iris[1:input$nrows,],
              callback = callback,
              extensions = 'Buttons',
              options = list(
                dom = 'B<"dwnld">frtip',
                buttons = list(
                  "copy"
                )
              )
    )
  )
  
  output$download1 <- downloadHandler(
    filename = function() {
      paste("data-", Sys.Date(), ".csv", sep="")
    },
    content = function(file) {
      write.csv(iris, file)
    }
  )
  
}

shinyApp(ui, server)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-09 17:25:51

您可以在downloadButton中使用hidden样式,如下所示。

代码语言:javascript
复制
library(shiny)
library(shinyjs)
library(DT)

callback <- JS(
  "var a = document.createElement('a');",
  "$(a).addClass('dt-button');",
  "a.href = document.getElementById('download1').href;",
  "a.download = '';",
  "$(a).attr('target', '_blank');",
  "$(a).text('Download');",
  "$('div.dwnld').append(a);",
  "$('#download1').hide();"
)

ui <- basicPage(
  # useShinyjs(),
  # hidden(downloadButton("download1", "")), # no label: this button will be hidden
  downloadButton("download1", "", style = "visibility: hidden;"),
  numericInput("nrows", "Number of rows", 10),
  DTOutput("dtable")
)

server <- function(input, output, session){
  output$dtable <- renderDT(
    datatable(iris[1:input$nrows,],
              callback = callback,
              extensions = 'Buttons',
              options = list(
                dom = 'B<"dwnld">frtip',
                buttons = list(
                  "copy"
                )
              )
    )
  )

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

}

shinyApp(ui, server)
票数 1
EN

Stack Overflow用户

发布于 2021-08-07 06:09:06

将按钮包含在不可见的div中:

代码语言:javascript
复制
ui <- basicPage(
  div(
    style = "display: none;",
    downloadButton("download1", ""), # no label: this button will be hidden
  ),
  numericInput("nrows", "Number of rows", 10),
  DTOutput("dtable")
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68688737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档