Загружаемые таблицы в Shiny - PullRequest
0 голосов
/ 06 марта 2020

Проблема: Ниже игрушечного блестящего приложения, из которого я хочу загрузить соответствующие преобразованные данные mtcars в выражении renderDataTable. Я знаю, что об этом спрашивали тысячу раз, но я не могу найти разумного решения, так как только файл 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)
    }

  )
}

1 Ответ

0 голосов
/ 06 марта 2020

Вы не можете использовать содержимое вывода в другой функции. Это подразумевает, что вам сначала нужно манипулировать данными в среде reactive, а затем использовать это реактивное выражение в любом месте.

Кроме того, нет необходимости использовать req(data_dev) в downloadHandler.

Вот исправленный код:

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)
...