【问题标题】:How to download datatable after editing in shiny如何在闪亮编辑后下载数据表
【发布时间】:2019-05-22 11:37:59
【问题描述】:

我在一个闪亮的应用程序的数据表中有大约 20,000 张图像。我想删除我不喜欢的图像,然后下载生成的数据表(只包含我想要的图像的路径名)。

我设法看到了一个数据框,每一行都向我展示了一张图片。我可以删除我不喜欢的行。我现在希望能够将数据帧(仅使用文件的路径而不是实际图像)下载到 csv 中。我似乎无法使用 downloadHandler 执行此操作。我错过了什么?

这是我的代码:

server.R

library(shiny)
library(shinydashboard)
library(data.table)
library(DT)
server<-shinyServer(function(input, output) {
  vals<-reactiveValues()
  vals$Data<-data.table(
    df
  )

  output$MainBody<-renderUI({
    fluidPage(
      box(width=12,
          hr(),

          column(12,dataTableOutput("Main_table")),
          tags$script(HTML('$(document).on("click", "input", function () {
                           var checkboxes = document.getElementsByName("row_selected");
                           var checkboxesChecked = [];
                           for (var i=0; i<checkboxes.length; i++) {
                           if (checkboxes[i].checked) {
                           checkboxesChecked.push(checkboxes[i].value);
                           }
                           }
                           Shiny.onInputChange("checked_rows",checkboxesChecked);
  })')),
      tags$script("$(document).on('click', '#Main_table button', function () {
                  Shiny.onInputChange('lastClickId',this.id);
                  Shiny.onInputChange('lastClick', Math.random())
});")

      )
      )
    })



  output$downloadData <- downloadHandler(
    filename = function() {
      paste(input$Main_table, ".csv", sep = "")
    },
    content = function(file) {
      write.csv(vals$Data, file, row.names = FALSE)
    }
  )

  output$Main_table<-renderDataTable({
    DT=vals$Data
    datatable(DT,
              escape=F)}
      )


})

ui.R

ui<-fluidPage(dashboardHeader(disable = T),
                  dashboardSidebar(disable = T),
                  downloadLink("downloadData", "Download"),
                  dashboardBody(uiOutput("MainBody")

                  )
)
# Run the application
shinyApp(ui = ui, server = server)

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    问题在于df 是来自library(stats) 的函数。请参阅?df。请不要使用df 作为变量名——这只会引起混淆;取而代之的是DF。您将此函数包装到 data.table() 中并将其传递给 reactiveValue(请参阅我添加的 print())。

    此构造被write.csv() 视为list(),它不知道如何处理list() 导致以下错误:

    write.table 中的错误:“EncodeElement”中未实现类型“list”

    因此,您可能希望通过例如修复您的 data.table 初始化。通过NULL 而不是df

    library(shiny)
    library(shinydashboard)
    library(data.table)
    library(DT)
    
    server <- shinyServer(function(input, output) {
    
      vals <- reactiveValues(myTabData = data.table(NULL))
      vals$Data <- data.table(df)
    
      print(paste("myData:", isolate(vals$Data)))
    
      output$MainBody <- renderUI({
        fluidPage(box(
          width = 12,
          hr(),
    
          column(12, dataTableOutput("Main_table")),
          tags$script(
            HTML(
              '$(document).on("click", "input", function () {
                               var checkboxes = document.getElementsByName("row_selected");
                               var checkboxesChecked = [];
                               for (var i=0; i<checkboxes.length; i++) {
                               if (checkboxes[i].checked) {
                               checkboxesChecked.push(checkboxes[i].value);
                               }
                               }
                               Shiny.onInputChange("checked_rows",checkboxesChecked);})'
            )
          ),
          tags$script(
            "$(document).on('click', '#Main_table button', function () {
                      Shiny.onInputChange('lastClickId',this.id);
                      Shiny.onInputChange('lastClick', Math.random())});"
          )
    
        ))
      })
    
    
    
      output$downloadData <- downloadHandler(
        filename = function() {
          "Main_table.csv"
        },
        content = function(file) {
          write.csv(vals$myTabData, file, row.names = FALSE)
    
          # Warning: Error in write.table: unimplemented type 'list' in 'EncodeElement'
          # write.csv(vals$Data, file, row.names = FALSE)
        }
      )
    
      output$Main_table <- renderDataTable({
        DT = vals$Data
        datatable(DT, escape = FALSE)
      })
    
    
    })
    
    ui <- fluidPage(
      dashboardHeader(disable = T),
      dashboardSidebar(disable = T),
      downloadLink("downloadData", "Download"),
      dashboardBody(uiOutput("MainBody"))
    )
    
    shinyApp(ui = ui, server = server)
    

    此外,您应该修复您的文件名(input$Main_table 不存在)

    【讨论】:

    • 感谢@ismirsehregal,虽然我永远不会猜到 csv 会将此作为列表....
    • 关于这样的事情,我喜欢使用browser() 进行调试。只需将它放在您的服务器代码中的某个位置,您就可以访问处于当前状态的变量/反应器。
    猜你喜欢
    • 2019-10-25
    • 2015-05-22
    • 2019-08-01
    • 2020-11-05
    • 2020-12-24
    • 2020-07-04
    • 1970-01-01
    • 2019-10-26
    • 2019-09-25
    相关资源
    最近更新 更多