materialSwitch在renderUI中无法响应点击的问题排查与解决
解决Shiny中renderUI内materialSwitch无法响应点击的问题
在Shiny应用中尝试用shinyWidgets::materialSwitch替代原生复选框优化UI,但发现该组件放在renderUI/uiOutput中时仅能正常显示,无法响应点击切换操作,且因业务需求必须使用renderUI实现。使用的包版本为:
- shinyWidgets_0.7.2
- shiny_1.7.2
原代码如下:
library(shiny) library(shinyWidgets) # library(shinyjs) ui <- fluidPage( div(class="row", column(width = 3, uiOutput("switch") ) ) ) server <- function(input, output, session) { output$switch = renderUI({ materialSwitch( inputId = "switch", label = "Show Count", right = TRUE, status = "primary", value = FALSE ) }) } shinyApp(ui = ui, server = server)
问题原因
出现该问题的核心原因是outputId与inputId重名:代码中uiOutput对应的outputId是"switch",同时materialSwitch的inputId也设置为"switch"。Shiny内部会将outputId对应的DOM容器与inputId绑定的交互元素产生命名冲突,导致组件的点击事件无法被正确注册和响应。
解决方法
只需要将materialSwitch的inputId修改为与outputId不同的名称即可,避免命名冲突。修改后的完整代码如下:
library(shiny) library(shinyWidgets) # library(shinyjs) ui <- fluidPage( div(class="row", column(width = 3, uiOutput("switch") ) ) ) server <- function(input, output, session) { output$switch = renderUI({ materialSwitch( inputId = "show_count_switch", # 修改此处inputId,与outputId不重复 label = "Show Count", right = TRUE, status = "primary", value = FALSE ) }) } shinyApp(ui = ui, server = server)
修改后,materialSwitch就能正常响应点击切换操作,后续可以通过input$show_count_switch获取组件的状态值。
内容的提问来源于stack exchange,提问作者Jamie
相关产品推荐
相关产品推荐

