Как получить информацию о строках DataTables с помощью Shiny и DT?

Я использую Shiny и пакет DT для отображения отфильтрованных таблиц из базы данных MySQL.

Короче говоря, я получаю входное значение от пользователя, создаю SQL-запрос, фиксирую результат и отображаю его как DataTable. Вывод может быть дополнительно отфильтрован с помощью фильтров столбца DataTable, и пользователь должен иметь возможность загрузить отфильтрованный набор данных.

Согласно документам DT, input$table_rows_all должен содержать индексы строк отображаемой таблицы. Однако, когда я нажимаю кнопку загрузки, я получаю файл только с именами столбцов и без данных.

library(shiny)
library(DT)
library(RMySQL)

con <- dbConnect(MySQL(), user="myuser", host="myhost", dbname="mydb")

shinyServer(function(input, output) { 

                sqlOutput <- reactive({
                    sqlInput <- paste0("select * from mydb.mytable",
                           " where value < ", input$value,
                           ";")
                    dbGetQuery(con, sqlInput)
                })

                output$table <- DT::renderDataTable(sqlOutput(), server=TRUE, rownames=FALSE, filter="top", options=list(pageLength=10))

                output$download <- downloadHandler("filtered.data.txt", content = function(file) {
                                           rows <- input$table_rows_all
                                           write.table(sqlOutput()[rows, ], file, sep="\t", quote=FALSE, col.names=TRUE, row.names=FALSE)
                })

})

В приведенном выше коде я сохраняю вывод DBI::dbQuery() в реактивную функцию sqlOutput(), чтобы затем передать его как DT::renderDataTable(), так и shiny::downloadHandler().

Что я делаю неправильно? Я не уверен, но похоже, что input$table_rows_all по какой-то причине возвращает пустой вектор.

Любая помощь очень ценится, спасибо!


person enricoferrero    schedule 16.09.2015    source источник
comment
Ваш downloadHandler выглядит нормально. Ваш input$table_rows_all, возвращающий пустой вектор, вероятно, является проблемой. Вам, вероятно, следует отредактировать свой вопрос и указать свой ui.R код, чтобы люди могли вам помочь.   -  person user5029763    schedule 17.09.2015


Ответы (1)


Ваш пример на самом деле не воспроизводится, но если вы просто хотите иметь возможность загрузить результирующую таблицу из блестящей с помощью DT, я бы посмотрел на Расширения DT. Здесь вы можете увидеть, что вы можете использовать tableTools, чтобы иметь возможность загрузки, вместо использования руководства downloadHandler.

Вот воспроизводимый пример, демонстрирующий функциональность:

Примечание. Вам потребуется www каталог и flash, установленные в вашем браузере.

library(shiny)
library(DT)

data(iris)

runApp(list(
  ui = fluidPage(
    sidebarLayout(
      sidebarPanel("DT Download Example"),
      mainPanel(
        DT::dataTableOutput("mytable")
        )
      )
    ),
  server = function(input, output) {
    output$mytable <- DT::renderDataTable({
      iris
    }, 
    extensions = 'TableTools',
    rownames=FALSE, 
    filter="top", 
    options=list(dom = 'T<"clear">lfrtip',
                 tableTools = list(
                   sSwfPath = copySWF('www'),
                   aButtons = list('copy', 'print',
                                   list(
                                     sExtends = 'collection',
                                     sButtonText = 'Save',
                                     aButtons = c('csv','xls')
                                     )
                                   )
                   )
                 )
    )
  }))

Вот непроверенная версия соответствующей части вашего кода:

output$table <- DT::renderDataTable({
  sqlOutput()
}, server=TRUE, 
extensions = 'TableTools',
rownames=FALSE, 
filter="top", 
options=list(pageLength=10,
             dom = 'T<"clear">lfrtip',
             tableTools = list(
               sSwfPath = copySWF('www'),
               aButtons = list('copy', 'print',
                               list(
                                 sExtends = 'collection',
                                 sButtonText = 'Save',
                                 aButtons = c('csv','xls'))))))
person cdeterman    schedule 16.09.2015
comment
Голосование против гораздо полезнее, если оно сопровождается комментарием. - person cdeterman; 21.09.2015