Как скачать datatable после редактирования в Shiny

У меня есть около 20 тысяч изображений в datatable в блестящем приложении. Я хочу удалить изображения, которые мне не нравятся, а затем загрузить полученную таблицу данных (только с путями к изображениям, которые я хочу).

Мне удалось увидеть фрейм данных с каждой строкой, показывающей мне изображение. Я могу удалить строки, которые мне не нравятся. Теперь я хотел бы иметь возможность загружать фрейм данных (только с путями файлов, а не с фактическими изображениями) в 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.R

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

                  )
)
# Run the application
shinyApp(ui = ui, server = server)
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
0
300
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что df — это функция от library(stats). Пожалуйста, смотрите ?df. Пожалуйста, никогда не используйте df в качестве имени переменной — это только вызовет путаницу; возьмите DF вместо этого. Вы обернули эту функцию в data.table() и передали ее в reactiveValue (см. print(), который я добавил).

Эта конструкция обрабатывается list() как write.csv(), и она не знает, что делать с list(), вызывая следующую ошибку:

Error in write.table: unimplemented type 'list' in 'EncodeElement'

Соответственно, вы можете исправить свою инициализацию 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 воспримет это как список....

Sebastian Zeki 23.05.2019 12:37

Что касается подобных вещей, мне нравится использовать browser() для отладки. Просто поместите его где-нибудь в код вашего сервера, и вы сможете получить доступ к переменным/реактивам в их текущем состоянии.

ismirsehregal 23.05.2019 14:00

Другие вопросы по теме