如何使用 Shiny 中 DT 的 Colvis 仅下载数据框中的选定列?

How to download only the selected columns in a dataframe using Colvis from DT in Shiny?

我正在使用 DT 包中的按钮 colvis 来 select 我想在 table 中显示哪些列。这里有更多关于按钮 colvisinfo。 它工作得很好,它隐藏了我不想select的列,结果显示给用户。

但是,我下载文件的时候好像没有更新这个信息。

如果我只select“Petal.Width”和“物种”:

然后,我下载文件...并打开它。我仍然拥有所有专栏,而不是 selected 的专栏。

我一直在努力寻找解决方案,但我什么也没找到。

有人知道怎么解决吗?

提前致谢。

这是我的代码:

library(shiny)
library(DT)

ui <- fluidPage(
  dataTableOutput("table")
)

server <- function(input, output, session) {
  output$table <- renderDataTable({
    datatable(
      iris,
      filter = list(position = 'top', clear = FALSE),
      selection = "none", #this is to avoid select rows if you click on the rows
      rownames = FALSE,
      extensions = 'Buttons',
      
      options = list(
        scrollX = TRUE,
        dom = 'Blrtip',
        buttons =
          list(I('colvis'),'copy', 'print', list(
            extend = 'collection',
            buttons = list(
              list(extend = 'csv', filename = paste0("iris"), title = NULL),
              list(extend = 'excel', filename = paste0("iris"), title = NULL)),
            text = 'Download'
          )),
        lengthMenu = list(c(10, 30, 50, -1),
                          c('10', '30', '50', 'All'))
      ),
      class = "display"
    )
  })
}

shinyApp(ui, server)
library(DT)

datatable(
  iris,
  extensions = "Buttons",
  options = list(
    dom = "Bfrtip",
    buttons = list(
      I("colvis"),
      list(
        extend = "collection",
        text = "Download",
        buttons = list(
          list(
            extend = "csv",
            exportOptions = list(
              columns = ":visible"
            )
          )
        )
      )
    )
  )
)

感谢 Stéphane Laurent 的回答,我找到了答案。

我在使用两个按钮(csv 和 excel)以及如何使用建议的解决方案组织列表时遇到了一些问题,但我找到了解决方法。

我会用原始代码添加答案,以防有人遇到像我这样的问题。

library(shiny)
library(DT)

ui <- fluidPage(
  dataTableOutput("table")
)

server <- function(input, output, session) {
  output$table <- renderDataTable({
    datatable(
      iris,
      filter = list(position = 'top', clear = FALSE),
      selection = "none", #this is to avoid select rows if you click on the rows
      rownames = FALSE,
      extensions = 'Buttons',
      
      options = list(
        scrollX = TRUE,
        dom = 'Blrtip',
        buttons =
          list(I('colvis'),'copy', 'print', list(
            extend = 'collection',
            text = 'Download',
            buttons = list(
              list(
                extend = "csv", filename = paste0("iris"), title=NULL,
                exportOptions = list(
                  columns = ":visible")
              ),
              
              list(
                extend = "excel", filename = paste0("iris"), title=NULL,
                exportOptions = list(
                  columns = ":visible")
              )
              
            )
          )),
        lengthMenu = list(c(10, 30, 50, -1),
                          c('10', '30', '50', 'All'))
      ),
      class = "display"
    )
  })
}

shinyApp(ui, server)