如何根据checkboxInput状态动态更新DT列值为Included/Excluded
解决方案
要实现点击checkbox后value列显示"Included"/"Excluded"而非布尔值,只需修改两处关键代码:初始化数据时替换布尔值,以及调整JS回调里的单元格赋值逻辑。
修改点说明
- 初始化数据框:把原始的
TRUE/FALSE替换为对应文本,保证初始显示正确 - JS回调函数:点击checkbox时,根据选中状态给单元格赋值对应文本,而非布尔值
修改后的完整代码
library(shiny) library(DT) # 修改JS代码:将布尔值替换为对应文本 js <- c( "$('[id^=check]').on('click', function(){", " var id = this.getAttribute('id');", " var i = parseInt(/check(\\d+)/.exec(id)[1]);", " var value = $(this).prop('checked');", " // 根据选中状态设置显示文本", " var displayText = value ? 'Included' : 'Excluded';", " var cell = table.cell(i-1, 2).data(displayText).draw();", "})") # 修改初始数据:替换布尔值为目标文本 df <- data.frame(item = c("a", "b", "c"), value = c("Included", "Included", "Included")) shinyInput <- function(FUN, len, id, ...) { inputs <- character(len) for (i in seq_len(len)) { inputs[i] <- as.character(FUN(paste0(id, i), label = NULL, ...)) } inputs } shinyValue = function(id, len) { unlist(lapply(seq_len(len), function(i) { value = input[[paste0(id, i)]] if (is.null(value)) FALSE else value })) } shinyCheckboxes <- function(len, id, checked){ inputs <- character(len) for (i in seq_len(len)) { inputs[i] <- as.character(checkboxInput(paste0(id, i), label=NULL, value = checked[i])) } inputs } server <- function(input, output, session) { output$tbl <- renderDT(server = FALSE, escape = FALSE, editable = TRUE, callback = JS(js), options = list( dom = 't', paging = FALSE, ordering = FALSE, preDrawCallback = JS('function() { Shiny.unbindAll(this.api().table().node()); }'), drawCallback = JS('function() { Shiny.bindAll(this.api().table().node()); } ') ), { # checkbox的选中状态仍用布尔值控制,不影响文本显示逻辑 checked <- sapply(c(TRUE, TRUE, TRUE), isTRUE) df$value_check <- shinyCheckboxes(nrow(df), "check", checked) df } ) observeEvent(input$tbl_rows_selected,{ print(input$tbl_rows_selected) }) } ui <- fluidPage( DTOutput("tbl") ) shinyApp(ui, server)
关键修改细节
- JS部分:新增
displayText变量,根据checkbox的选中状态(布尔值)映射为目标文本,再将文本赋值给对应单元格 - 初始数据:将
df$value的布尔值直接替换为"Included",确保页面加载时显示正确内容 - checkbox初始化:
checked参数依然使用布尔值,因为checkbox的选中状态需要布尔值控制,与文本显示逻辑互不干扰
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

