скачать CSV с использованием отфильтрованного фрейма данных RShiny - PullRequest
1 голос
/ 13 марта 2019

Я сделал блестящее приложение, в котором я фильтрую набор данных, используя некоторые значения, и затем я хотел бы иметь возможность загрузить этот отфильтрованный набор данных.Тем не менее, я изо всех сил пытаюсь понять, как я могу передать отфильтрованный набор данных в загрузчик CSV.Это очень большой набор данных, поэтому он не может использовать кнопки, доступные в renderDataTable (я думаю?) У кого-нибудь есть идеи, как мне это сделать?

Пример приложения:

### data ###
egDf <- data.frame(col1 = sample(letters,10000,replace=T), col2 = sample(letters,10000, replace=T))

### modules ###
chooseCol1UI <- function(id){
  ns <- NS(id)
  uiOutput(ns('chooserCol1'))
}
chooseCol1 <- function(input, output, session, data){
  output$chooserCol1 <- renderUI({
    ns <- session$ns
    pickerInput(inputId = ns('chosenCol1'),
              label = 'Col1',
              choices = paste(sort(unique(egDf$col1))),
              options = list(`actions-box` = TRUE),
              multiple = TRUE)
  })

  return(reactive(input$chosenCol1))

}

csvDownloadUI <- function(id, label = "Download CSV") {
  ns <- NS(id)
  downloadButton(ns("downloadData"), label)
}
csvDownload <- function(input, output, session, data) {
  output$downloadData <- downloadHandler(
    filename = function() {
      paste(names(data), Sys.Date(), '.csv', sep='')
    },
    content = function(file) {
      write.csv(data, file, row.names = FALSE)
    }
  )
}

displayTableUI <- function(id){
  ns <- NS(id)
  DT::dataTableOutput(ns('displayer'))
}
displayTable <- function(input, output, session, data, col1Input){
  output$displayer <- DT::renderDataTable(egDf %>% filter(col1 %in% col1Input()))
}

### server ###
server <- function(input,output){
  chosenCol1 <- callModule(chooseCol1,
                               id = 'appChooseCol1', data = egDf)
  callModule(module = displayTable, id = "appDisplayTable",
             col1Input = chosenCol1)
}

### ui ###
ui <- fluidPage(
  sidebarPanel(
  chooseCol1UI("appChooseCol1")),
mainPanel(displayTableUI("appDisplayTable")))

### app ###
shinyApp(ui = ui, server = server)

Ответы [ 2 ]

2 голосов
/ 17 марта 2019

Несколько лет назад я сделал приложение с такой кнопкой. В моем случае я создал реактивное выражение в файле server.R, который передается в downloadHandler.

Вот приложение , а вот код github . Перейдите к файлу server.R и найдите строку "download".

В приложении вы найдете синюю кнопку загрузки на вкладке «Данные». Приложение позволяет применять фильтры, которые применяются в таблице данных, которую можно загрузить с помощью кнопки.

Редактировать: вот серверная часть кода интереса:

#data download button
   output$idDwn <- downloadHandler(
    filename = function() { 
     paste('uCount ', format(Sys.time(), "%Y-%m-%d %H.%M.%S"), '.csv', sep='')
    },
    content = function(file) {
     write.csv(datasetInputFilters(), file)
    }
   )
1 голос
/ 18 марта 2019

Я бы создал eventReactive функцию, которая позволяет вашему col1Input.

  # Reactive function based on input
  react_df <- eventReactive(input$chosenCol1, {

    return(egDf %>% filter(col1 %in% input$chosenCol1))

  })

  output$displayer <- renderDataTable(react_df())

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

      output_d <- react_df()

      write.csv(output_d, file, row.names = FALSE)

    }
  )
...