首页 > 解决方案 > 如何在闪亮编辑后下载数据表

问题描述

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

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

这是我的代码:

服务器.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<-fluidPage(dashboardHeader(disable = T),
                  dashboardSidebar(disable = T),
                  downloadLink("downloadData", "Download"),
                  dashboardBody(uiOutput("MainBody")

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

标签: rshiny

解决方案


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

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

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

因此,您可能希望通过例如传递而不是来修复data.table初始化:NULLdf

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不存在)


推荐阅读