You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R Shiny使用rowname=FALSE隐藏索引列时指定列仍显示的问题

问题:R Shiny中DT表格无法隐藏指定列(schema列仍显示)

我在R Shiny的DT表格渲染代码里用rowname=FALSE隐藏了索引列,但指定要隐藏的“schema”列还是出现在表格里,以下是数据示例和相关代码,求排查解决。

数据示例

schema  gruppe  name    Week    dose    symptome
A         A1    XXX        1    1.2     HA
A         A2    YYY        2    11.2    DI
B         A1    XXX        1    1.2     HA
B         A2    YYY        2    11.2    DI
C         A1    XXX        1    1.2     HA
C         A2    YYY        2    11.2    DI
D         A1    XXX        1    1.2     HA
D         A2    YYY        2    11.2    DI
E         A1    XXX        1    1.2     HA
E         A2    YYY        2    11.2    DI
F         A1    XXX        1    1.2     HA
F         A2    YYY        2    11.2    DI

相关代码

server <- function(input, output, session) {
  drug <- read.csv("Combined_All_gruppe.csv", fileEncoding="latin1" )
  
  filterVars <- c("gruppe", "name", "dose", "schema")
  freezeReactiveValue(input, "gruppe")
  updateSelectizeInput(session, 'gruppe', choices = c("", unique(drug$gruppe)), selected = "", server = TRUE)
  
  filteredData <- reactive({
    tmpDF <- drug
    for(var in filterVars){
      if(isTruthy(input[[var]])){
        filteredTmpDF <- with(tmpDF, tmpDF[get(var) %in% input[[var]],])
        if(nrow(filteredTmpDF) > 0){
          tmpDF <- filteredTmpDF
        }
      }
    }
    tmpDF
  })
  
  observeEvent(input$gruppe, {
    updateSelectizeInput(session, 'name', choices = c("", unique(filteredData()$name)), selected = "", server = TRUE)
  })
  
  observeEvent(input$name, {
    updateSelectizeInput(session, 'dose', choices = c("", unique(filteredData()$dose)), selected = "", server = TRUE)
  })
  
  observeEvent(input$dose, {
    updateSelectizeInput(session, 'schema', choices = c("", unique(filteredData()$schema)), selected = "", server = TRUE)
  })
  
  output$table <- DT::renderDataTable({
   hide_columns <- which(names(filteredData()) %in% c("schema", "gruppe","name", "dose", "symptome"))
    datatable(filteredData(), extensions='Buttons', rownames=FALSE,  options=list(columnDefs = list(list(visible=FALSE,  targets=hide_columns))))
  })
}

问题排查与解决

核心原因

DT包的columnDefs中targets参数使用0起始的列索引,但R中which()函数返回的是1起始的列位置,直接传递会导致列索引不匹配,无法正确隐藏目标列。

修复方案

将which()返回的1-based索引转换为0-based索引(减1即可),修改renderDataTable部分代码如下:

output$table <- DT::renderDataTable({
  # 定义需要隐藏的列名
  cols_to_hide <- c("schema", "gruppe","name", "dose", "symptome")
  # 转换为DT要求的0-based索引
  hide_columns <- which(names(filteredData()) %in% cols_to_hide) - 1
  datatable(filteredData(), 
            extensions='Buttons', 
            rownames=FALSE,  
            options=list(
              columnDefs = list(list(visible=FALSE, targets=hide_columns))
            ))
})

额外验证点

  • 确认filteredData()返回的列名与你指定的隐藏列名完全一致(R中列名区分大小写)
  • 如果仍有问题,可以打印hide_columns的值,检查是否对应正确的列索引:
    print(hide_columns)
    

内容的提问来源于stack exchange,提问作者KApril

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 19:10:19