R语言Shiny模块内部按钮点击事件的外部检测问题咨询
问题原因
你当前写法失效的核心原因是:ret本身是reactiveVal类型,你在返回列表里写reactive(ret)时,没有调用ret()获取响应式值,这个表达式只会返回ret这个固定的对象引用,不存在响应式依赖触发,所以外部的observeEvent永远不会被触发。
修复方案
只需要修改buttonServer里返回列表的部分,两种可选写法都能满足你返回列表的需求:
写法1:直接把reactiveVal赋值给列表元素
reactiveVal本身就是响应式对象,可以直接放在列表里返回,不需要额外套reactive():
buttonServer <- function(id, parent) { moduleServer(id, function(input, output, session) { ns <- session$ns ret <- reactiveVal(0) observeEvent(input$btn,{ message("inner", ret()) ret(ret()+1) }) # 直接把reactiveVal放在列表中返回 list(n = ret) }) }
写法2:如果需要套reactive(比如要加额外逻辑),记得调用ret()获取值
如果你在返回前需要对ret的值做额外处理,一定要在reactive内部调用ret()触发响应式依赖:
list(n = reactive({ # 这里可以加额外的处理逻辑 ret() }))
修改后你原本的外部监听逻辑不需要做任何改动,点击按钮就能正常触发observeEvent(v$n, ...)输出"outer"。
内容的提问来源于stack exchange,提问作者zhanxw
相关产品推荐
相关产品推荐

