Downloadhandler с отфильтрованными данными в Shiny - PullRequest
0 голосов
/ 27 ноября 2018

Я попытался использовать синтаксис приведенных здесь кодов Загрузить отфильтрованные данные из renderDataTable () в Shiny , а здесь R - Загрузить отфильтрованные данные .В моем случае я использую собственный файл .csv, а не стандартные данные 'mtcars'.По какой-то причине я не могу найти файл, если хочу его скачать (я открываю его в браузере).Код выглядит следующим образом:

library(shiny)
library(ggplot2)
library(DT)
library(readr)

tbl <- read.csv(file.choose(new = FALSE), header = TRUE, sep = ",", stringsAsFactors=TRUE)     

# Define UI -------
ui <- navbarPage(
  title = "Data Table Options",

  tabPanel("Lot Dataset",
         DT::dataTableOutput("dt"),  #datatable

           div(h3("Download"), style = "color:blue"),
           helpText(" Select the download format"),
           radioButtons("type", "Format type:",
                        choices = c("Excel (CSV)", "Text (Space Separated)", "Doc")),
           br(),
           helpText(" Click on the download button to download the Lot Dataset"),
           p("Below are the row indices of the data."),
           verbatimTextOutput("filtered_row"),
           br(),
           helpText(" Click on the download button to download the Lot Dataset"),
           downloadButton("download_filtered", "Download Filtered Data"),   
           br()
         )
)

и функция сервера с обработчиком загрузки:

server <- function(input, output) {

  thedata <- reactive({datatable(tbl, filter = "top",options =  list(pageLength = 25))})

  output$dt <- DT::renderDataTable({
    thedata()
  })

  #bottom panel with row indices
  output$filtered_row <- 
    renderPrint({
      input[["dt_rows_all"]]
    })

  #file extension for download
  fileext <- reactive({
    switch(input$type,
           "Excel (CSV)" = "csv", "Text" = "txt", "Doc" = "doc")
  })
  #downloadHandler() for file download of Lot Dataset
  output$download_filtered <- downloadHandler(

    filename = function() {
      file_name <- paste("MLdataset_test", fileext(), sep=".")  #filename 
    },

    content = function(file) {
      write.csv(thedata()[input[["dt_rows_all"]], ],
            file)  
    }
   )

}

# Run the app ----
shinyApp(ui = ui, server = server)

Я хочу иметь возможность загружать отфильтрованные данные, но по какой-то причине не можетнайти файл, когда я хочу загрузить

Каждый раз, когда я пытаюсь загрузить его, в консоли появляется следующая ошибка:

Warning: Error in [: incorrect number of dimensions
  [No stack trace available]

размер файла .csv ist:

dim (tbl) [1] 19100 56

Я был бы очень признателен за любую помощь, пытаясь исправить это часами, но безуспешно!

Ответы [ 2 ]

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

Это также работает (возможно, слишком много ненужного кода)

server <- function(input, output) { 
  thedata <- reactive({
    datatable(tbl, filter = "top",options = list(pageLength = 25))
    })

  #editing the tbl dataset with the filtered rows only
  thedata_filtered <- reactive({
    tbl[c(input[["dt_rows_all"]]), ]
  })

  output$dt <- DT::renderDataTable({
    thedata()
  })

  #bottom panel with row indices
  output$filtered_row <- 
    renderPrint({
      input[["dt_rows_all"]]
    })

  #file extension for download
  fileext <- reactive({
    switch(input$type,
       "Excel (CSV)" = "csv", "Text" = "txt", "Doc" = "doc")
  })
  #downloadHandler() for file download of Lot Dataset
  output$download_filtered <- downloadHandler(

    filename = function() {
      file_name <- paste("MLdataset_test", fileext(), sep=".")  #filename 
    },

    content = function(file) {
      write.table(thedata_filtered(), file)  
    }
   )
}
0 голосов
/ 27 ноября 2018

Хорошее приложение.Ваша проблема в основном в том, что thedata() это DT::datatable, а не фактические данные.Я переработал его, который теперь работает для меня, см. Комментарии в сценарии:

library(shiny)
library(ggplot2)
library(DT)
library(readr)

tbl <- read.csv(file.choose(new = FALSE), header = TRUE, sep = ",", stringsAsFactors=TRUE)     

# Define UI ----
ui <- navbarPage(
  title = "Data Table Options",

  tabPanel("Lot Dataset",
           DT::dataTableOutput("dt"),  #datatable

           div(h3("Download"), style = "color:blue"),
           helpText(" Select the download format"),
           radioButtons("type", "Format type:",
                        choices = c("Excel (CSV)", "Text (Space Separated)", "Doc")),
           br(),
           helpText(" Click on the download button to download the Lot Dataset"),
           p("Below are the row indices of the data."),
           verbatimTextOutput("filtered_row"),
           br(),
           helpText(" Click on the download button to download the Lot Dataset"),
           downloadButton("download_filtered", "Download Filtered Data"),   
           br()
  )
)

server <- function(input, output) {

  #!! I've moved the datatable directly in here as 'thedata()' was a bit redundant and confusing
  output$dt <- DT::renderDataTable({
    datatable(tbl,filter = "top",options =  list(pageLength = 25)) 
  })

  #bottom panel with row indices
  output$filtered_row <- 
    renderPrint({
      input[["dt_rows_all"]]
    })

  #file extension for download
  fileext <- reactive({
    switch(input$type,
           "Excel (CSV)" = "csv", "Text" = "txt", "Doc" = "doc")
  })


  #downloadHandler() for file download of Lot Dataset
  output$download_filtered <- downloadHandler(

    filename = function() {
      paste("MLdataset_test", fileext(), sep=".")  #filename
    },

    content = function(file) {

      #!! Use tbl and not 'thedata()' to filter. tbl is the data, the other was the datatable
      write.csv(tbl[input[["dt_rows_all"]], ],
                file= file,
                #!! assumed we don't want the row names
                row.names=F)
    }
  )


}

shinyApp(ui, server)
...