使用DT包在响应式数据表中隐藏某些列

28

我正在尝试使用DT包创建一个响应式数据表格,用于我的shiny应用程序。我想提前隐藏某些列。例如:

library("shiny")
library("DT")
shinyApp(
  ui = fluidPage(DT::dataTableOutput('tbl')),
  server = function(input, output) {
    output$tbl = DT::renderDataTable(
      iris,extensions="Responsive"
    )
  }
)

这个输出结果给了我5列。只有在缩小页面时才会隐藏列。但是,我想预先隐藏最后3列,每次只想看到前两列。有没有办法做到这一点?

更新:

示例输出

输入图像描述

3个回答

37
您可以使用DT选项或扩展程序隐藏表中的列。
如果您希望它们预先隐藏但有一个按钮使它们再次可见,那么ColVis扩展程序应该适合您:link 如果您只想让它们保持隐藏,请添加以下选项(我现在无法记起在哪里看到它的文档了..)
options=list(columnDefs = list(list(visible=FALSE, targets=columns2hide)))

能否在默认情况下使用ColVis隐藏某些列,并在用户勾选框后显示它们? - Rain Man
4
注意,当您填写“colmuns2hide”时,应输入列号。不确定是否可以输入列名。 - John Paul
2
你不能直接这样做,你需要使用 match(columns2hide, colnames(iris)),如果 columns2hide 中包含数据中不存在的列,则可能需要在其周围加上 na.omit - flying sheep
10
请注意,DT的列索引似乎从0开始,而不是1,因此为match(columns2hide, colnames(iris))-1L - lukeA
2
列索引可能会让你措手不及。它从0开始,但行名称被计算为列0。因此,索引取决于是否启用了行名称。 - dracodoc
显示剩余3条评论

1

我有另一种方法,因其易读性而喜欢。但它并不能解决列编号的问题。

library("shiny")
library("DT")
library(magrittr)
columns2hide <- match('Sepal.Width', colnames(iris))
shinyApp(
  ui = fluidPage(DT::dataTableOutput('tbl')),
  server = function(input, output) {
    output$tbl = DT::renderDataTable(
      {
        dataTableProxy(outputId = 'tbl') %>%
          hideCols(hide = columns2hide)
        iris
      },
      extensions="Responsive"
    )
  }
)

dataTableProxy 创建一个代理对象,您可以使用一些函数进行操作(请参见?dataTableProxy)。 例如,当单击按钮时,它可以方便地隐藏/显示/选择/添加表格的行和列。 因为默认情况下它具有deferUntilFlush = TRUE,所以它会等待直到下一代才处理表格。在这种情况下,这只是在下一行发生。


1
options=list(columnDefs = list(list(visible=FALSE, targets=columns2hide)))

colums2hide <- c('col_name_1','col_name_2')

这是如何通过指定列名与列号来完成的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接