R Shiny首次启动时如何消除observeEvent引发的控件闪烁问题
问题解决方法
闪烁的核心原因是UI初始化加载时input2默认是可见状态,服务端的observeEvent隐藏逻辑需要等Shiny会话建立、事件绑定完成后才会执行,两者的时间差就导致了控件短暂闪显。不需要借助renderUI,直接在UI层做默认隐藏处理就能彻底解决该问题:
方案1:使用shinyjs内置的hidden函数(推荐)
直接用shinyjs自带的hidden()函数包裹input2控件,UI渲染阶段就会将该控件设为隐藏状态,完全消除闪烁可能,仅需修改UI中input2的定义部分,其余代码无需调整,修改后的完整代码如下:
library(shiny) library(shinyjs) f <- function(action,i){as.character(checkboxInput(paste0(action,i),label=NULL))} actions <- c("show", "reset") tbl <- t(outer(actions, c(1,2), FUN = Vectorize(f))) colnames(tbl) <- c("Show", "Reset") rownames(tbl) <- c("Input 2", "Input 3") ui <- fluidPage( useShinyjs(), tags$head( tags$style(HTML( "td .checkbox {margin-top: 0; margin-bottom: 0;} td .form-group {margin-bottom: 0;}" )) ), br(), sidebarLayout( sidebarPanel( numericInput("input1", "Input 1:", 10, min = 1, max = 100), h5(strong("Add inputs:")), tableOutput("checkboxes"), # 仅修改此行,用hidden包裹input2控件 shinyjs::hidden(numericInput("input2", "Input 2:", 10, min = 1, max = 100)), ), mainPanel() ) ) server <- function(input, output, session){ output[["checkboxes"]] <- renderTable({tbl}, rownames = TRUE, align = "c", sanitize.text.function = function(x) x ) observeEvent(input[["show1"]], { if(input[["show1"]] %% 2 == 1){shinyjs::show(id = "input2")} else {shinyjs::hide(id = "input2")} }) } shinyApp(ui, server)
方案2:手动添加内联隐藏样式
如果不想使用shinyjs的封装函数,也可以直接给input2添加内联样式设置默认隐藏,效果完全一致,修改方式如下:
# 将原input2的定义替换为以下代码即可 numericInput("input2", "Input 2:", 10, min = 1, max = 100) %>% htmltools::tagAppendAttributes(style = "display: none;")
内容的提问来源于stack exchange,提问作者Curious Jorge - user9788072
相关产品推荐
相关产品推荐

