传递给Shiny input的变量未触发observeEvent问题排查
问题排查与解决
你的observeEvent完全未触发,核心原因有两点:
- 你通过
shinyjs::runjs设置Input3值的时机是服务器启动阶段,这个值会被Shiny判定为Input3的初始值 observeEvent里的ignoreInit = T参数会明确忽略输入的初始加载值,只响应后续的动态更新
下面给出两种针对性的解决办法:
方法1:移除ignoreInit = T参数
直接去掉这个参数,让observeEvent可以捕捉到初始值的变化,修改后的服务器代码如下:
server <- function(input, output, session) { shinyjs::runjs( ' var metadata = "{\"id\":[115],\"email\":[\"test_email_address\"]}"; Shiny.setInputValue("Input3", metadata); ' ) observeEvent(input$Input3, { updateActionButton(inputId = 'Button', label = 'Success') updateTextAreaInput(inputId = 'Input4', value = input$Input3) }) }
方法2:延迟JS代码执行(保留ignoreInit = T的场景)
如果必须保留ignoreInit = T,可以利用Shiny的session$onFlushed事件,确保JS代码在页面初始化完成后再执行,这样设置的Input3值会被判定为后续更新而非初始值:
server <- function(input, output, session) { session$onFlushed(function() { shinyjs::runjs( ' var metadata = "{\"id\":[115],\"email\":[\"test_email_address\"]}"; Shiny.setInputValue("Input3", metadata); ' ) }, once = TRUE) observeEvent(input$Input3, ignoreInit = T, { updateActionButton(inputId = 'Button', label = 'Success') updateTextAreaInput(inputId = 'Input4', value = input$Input3) }) }
额外提示:你通过JS传入的是JSON格式的字符串,如果后续需要解析成R对象,可以使用jsonlite::fromJSON(input$Input3)来处理。
内容的提问来源于stack exchange,提问作者Camdoon
相关产品推荐
相关产品推荐

