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

如何在Shiny中借助shinyjs、shinyWidgets启用/禁用指定radioGroupButtons选项

解决方案

可以直接使用shinyWidgets包自带的updateRadioGroupButtons函数的disabled参数实现需求,不需要修改原有UI结构,也不需要拆分控件组,逻辑兼容性更强。

修改后的完整可运行代码如下:

library(shiny)
library(shinyWidgets)
library(shinyjs)

ui <- fluidPage(
  useShinyjs(),
  selectInput("disabler",
              label = "Choose button to disable",
              choices = c("None", "1", "2", "3", "4", "5")),
  radioGroupButtons("buttons",
                    label = "Here are the buttons:",
                    selected = "1",
                    choiceNames = c("1", "2", "3", "4", "5"),
                    choiceValues = c("1", "2", "3", "4", "5"),
                    individual = FALSE)
)

server <- function(input, output, session) {
  observeEvent(input$disabler, {
    # 每次更新前先重置所有按钮为启用状态
    disabled_btns <- c()
    if(input$disabler != "None") {
      disabled_btns <- input$disabler
    }
    # 更新单选按钮组,仅禁用指定选项
    updateRadioGroupButtons(
      session = session,
      inputId = "buttons",
      disabled = disabled_btns
    )
  })
}

shinyApp(ui = ui, server = server)

实现效果说明:

  • 当disabler选择None时,所有单选按钮均为可点击状态
  • 当disabler选择对应数值时,仅该数值对应的单选按钮会被禁用,其余按钮保持正常可点击状态,不会影响整个控件组的其他功能
  • 如果需要同时禁用多个选项,只需给disabled参数传入对应value的向量即可,例如disabled = c("1","3")就会同时禁用第1、第3个按钮

如果有特殊交互需求必须用shinyjs实现,也可以通过CSS选择器定位单个按钮,替换server部分逻辑即可:

observeEvent(input$disabler, {
  # 先启用所有按钮
  shinyjs::enable(selector = "#buttons input")
  if(input$disabler != "None") {
    # 仅禁用指定value的按钮
    shinyjs::disable(selector = paste0("#buttons input[value='", input$disabler, "']"))
  }
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:24:04