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

