Проблема с загрузкой данных с помощью Download Handlers в ShinyApp - PullRequest
0 голосов
/ 20 ноября 2018

Мои исходные данные mtcar загружаются с использованием Загрузка обработчиков в ShinyApp , тогда как я хочу, чтобы измененные данные (используя SelectInputs) загружались через обработчики. Я также приложил свои коды, пожалуйста, дайте мне знать, что с ними не так. Большое спасибо:)

library(shiny)
library(tidyr)
library(dplyr)
library(readr)
library(DT)

data_table <- mtcars

# Define UI
ui <- fluidPage(

downloadButton('downLoadFilter',"Download the filtered data"),

selectInput(inputId = "cyl", 
          label = "cyl:",
          choices = c("All",
                      unique(as.character(data_table$cyl))),
          selected = "4", 
          multiple = TRUE),

selectInput(inputId = "vs", 
          label = "vs:",
          choices = c("All",
                      unique(as.character(data_table$vs))),
          selected = "1", 
          multiple = TRUE),

DT::dataTableOutput('ex1'))

server <- function(input, output) {

thedata <- reactive({
if(input$cyl != 'All'){
  return(data_table[data_table$cyl == input$cyl,])
}

else if(input$vs != 'All'){
  return(data_table[data_table$vs == input$vs,])
}

else{
  return(data_table)
}
})

output$ex1 <- DT::renderDataTable(DT::datatable(filter = 'top',
                                              escape = FALSE, 
                                              options = list(pageLength = 
10, scrollX='500px',autoWidth = TRUE),{
                                                thedata() # Call reactive 
thedata()
                                              }))


output$downLoadFilter <- downloadHandler(
filename = function() {
  paste('Filtered data-', Sys.Date(), '.csv', sep = '')
},
content = function(path){
  write_csv(thedata(),path) # Call reactive thedata()
})}

shinyApp(ui = ui, server = server)

1 Ответ

0 голосов
/ 20 ноября 2018

Вы обновляете thedata() только внутри вашего renderDataTable.Вам нужно сделать его реактивным, а затем использовать его для рендеринга в виде DataTable и загрузки.Измените свой сервер на:

# Define server logic
server <- function(input, output) {

  thedata <- reactive({
    if(input$cyl != 'All'){
      return(data_table[data_table$cyl == input$cyl,])
    }
    else{
      return(data_table)
    }
  })

output$ex1 <- DT::renderDataTable(DT::datatable(filter = 'top',
                                                  escape = FALSE, 
              options = list(pageLength = 10, scrollX='500px',autoWidth = TRUE),{
                                 thedata() # Call reactive thedata()
                               }))


output$downLoadFilter <- downloadHandler(
    filename = function() {
      paste('Filtered data-', Sys.Date(), '.csv', sep = '')
    },
    content = function(path){
      write_csv(thedata(),path) # Call reactive thedata()
    })}
...