Shiny如何将按钮值传递到其他模块?解决Promise评估报错问题
问题成因
你的代码核心错误出在响应式对象的传递与求值逻辑上:
- 你在主server调用
mod_test_server时,给btn参数传的是btnClicked(),末尾带括号意味着你直接对eventReactive返回的响应式对象做了立即求值,实际传入模块的是运行到该行时按钮点击次数的静态数值,而非可以监听更新的响应式对象本身,因此后续按钮点击永远不会触发模块内的更新。 - 控制台出现的
restarting interrupted promise evaluation警告,是因为你在模块的renderPrint响应式上下文中直接使用了静态值btn,Shiny内部的响应式依赖追踪机制误判了依赖关系,导致promise评估流程异常中断。 - 额外说明:你写的
btnClicked本身是冗余逻辑,和直接返回button()没有区别,完全可以省略。
修复方法
只需要修改两处代码即可:
- 主server调用
mod_test_server时,传入响应式对象本身(不要加括号求值) - 模块内
renderPrint中对响应式对象求值时加上括号
修正后的完整代码
library(shiny) library(dplyr) # 注意:原代码使用了actionBttn,需要加载shinyWidgets包 library(shinyWidgets) moduleServer <- function(id, module) { callModule(module, id) } # UI - btn # mod_btn_UI <- function(id) { ns <- NS(id) actionBttn(ns("btn"), "Click me") } # Server - btn # mod_btn_server <- function(id){ moduleServer(id, function(input, output, session) { return(reactive({input$btn})) }) } # UI - table # mod_test_UI <- function(id) { ns <- NS(id) verbatimTextOutput(ns("myBtn")) } # Server - table # mod_test_server <- function(id, btn){ moduleServer(id, function(input, output, session) { ns <- session$ns # 此处对传入的响应式对象btn求值,加括号 output$myBtn <- renderPrint({btn()}) }) } # App # ui <- fluidPage( tagList( mod_btn_UI("btn"), mod_test_UI("test") ) ) server <- function(input, output, session) { button <- mod_btn_server("btn") # 直接传响应式对象本身即可,不需要额外包eventReactive mod_test_server("test", button) } shinyApp(ui = ui, server = server)
内容的提问来源于stack exchange,提问作者mustafa00
相关产品推荐
相关产品推荐

