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
相关产品推荐
相关产品推荐

