You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shiny如何将按钮值传递到其他模块?解决Promise评估报错问题

问题成因

你的代码核心错误出在响应式对象的传递与求值逻辑上:

  • 你在主server调用mod_test_server时,给btn参数传的是btnClicked(),末尾带括号意味着你直接对eventReactive返回的响应式对象做了立即求值,实际传入模块的是运行到该行时按钮点击次数的静态数值,而非可以监听更新的响应式对象本身,因此后续按钮点击永远不会触发模块内的更新。
  • 控制台出现的restarting interrupted promise evaluation警告,是因为你在模块的renderPrint响应式上下文中直接使用了静态值btn,Shiny内部的响应式依赖追踪机制误判了依赖关系,导致promise评估流程异常中断。
  • 额外说明:你写的btnClicked本身是冗余逻辑,和直接返回button()没有区别,完全可以省略。
修复方法

只需要修改两处代码即可:

  1. 主server调用mod_test_server时,传入响应式对象本身(不要加括号求值)
  2. 模块内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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 20:33:00