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

如何根据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)

关键修改细节

  1. JS部分:新增displayText变量,根据checkbox的选中状态(布尔值)映射为目标文本,再将文本赋值给对应单元格
  2. 初始数据:将df$value的布尔值直接替换为"Included",确保页面加载时显示正确内容
  3. checkbox初始化:checked参数依然使用布尔值,因为checkbox的选中状态需要布尔值控制,与文本显示逻辑互不干扰

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 14:39:57