闪亮的可下载表格

Downloadable tables in Shiny

问题: 下面是一个闪亮的玩具应用程序,我想从中下载 renderDataTable 表达式中 mtcars 的相应转换数据。我知道这个问题被问过一千次,但我找不到合理的解决方案,因为只能下载一个包含无用信息的 html 文件,或者使用此应用程序会引发错误。

非常感谢!

亮码

library(shiny)
library(DT)
library(data.table)

source("download_module.R")

ui <- fluidPage(
    dataTableOutput("table"),
    tableDownload_UI("download_data")
)

server <- function(input, output) {

    output$table <- renderDataTable({
      mt_dt <- as.data.table(mtcars)
      mt_dt[, .N, by = .(cyl)]
    })

    callModule(tableDownload_server,
               "download_data",
               output$table,
               file_name = "dieterdata.csv"
               )


}

shinyApp(ui = ui, server = server)

下载模块

tableDownload_UI <- function(id, label = "Download data"){
  ns <- NS(id)

  downloadButton(ns("download_data"), label)
}

tableDownload_server <- function(input,
                                 output,
                                 session,
                                 data_dev,
                                 file_name){

  output$download_data <- downloadHandler(
    req(data_dev),

    filename <- function(){
      file_name
    },
    content <- function(file){
      fwrite(data_dev, file)
    }

  )
}

您不能在另一个函数中使用输出的内容。这意味着您需要首先在 reactive 环境中操作您的数据,然后在任何您想要的地方使用这个反应式表达式。

此外,downloadHandler中不需要使用req(data_dev)

这是更正后的代码:

library(shiny)
library(DT)
library(data.table)

tableDownload_UI <- function(id, label = "Download data"){
  ns <- NS(id)

  downloadButton(ns("download_data"), label)
}

tableDownload_server <- function(input, output, session, data_dev, file_name){

  output$download_data <- downloadHandler(

    filename = function(){
      file_name
    },
    content = function(file){
      fwrite(data_dev, file)
    }

  )
}

ui <- fluidPage(
  dataTableOutput("table"),
  tableDownload_UI("download_data")
)

server <- function(input, output) {

  yourdata <- reactive({
    mt_dt <- as.data.table(mtcars)
    mt_dt[, .N, by = .(cyl)]
  })

  output$table <- renderDataTable({
    yourdata()
  })

  callModule(tableDownload_server,
             "download_data",
             data_dev = yourdata(),
             file_name = "dieterdata.csv"
  )


}

shinyApp(ui = ui, server = server)