【问题标题】:How do I retrieve DataTables rows information with Shiny and DT?如何使用 Shiny 和 DT 检索 DataTables 行信息?
【发布时间】:2015-12-12 23:39:31
【问题描述】:

我正在使用 Shiny 和 DT 包来显示来自 MySQL 数据库的过滤表。

简而言之,我从用户那里得到一个输入值,创建一个 SQL 查询,捕获输出并将其显示为一个 DataTable。可以使用 DataTable 列过滤器进一步过滤输出,用户应该能够下载过滤后的数据集。

根据DT docsinput$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 出于某种原因返回了一个空向量。

非常感谢任何帮助,谢谢!

【问题讨论】:

  • 您的downloadHandler 看起来不错。您的 input$table_rows_all 返回一个空向量可能是问题所在。您可能应该编辑您的问题并提供您的 ui.R 代码,以便人们可以帮助您。

标签: r datatables shiny dt


【解决方案1】:

您的示例并不是真正可重现的,但如果您只是希望能够使用 DT 从闪亮下载生成的表,我会查看 DT extensions。在那里你可以看到你可以使用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'))))))

【讨论】:

  • 在附上评论时,投反对票会更有用。
猜你喜欢
  • 1970-01-01
  • 2015-06-29
  • 2020-12-15
  • 2021-11-19
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
  • 2021-08-22
  • 1970-01-01
相关资源
最近更新 更多