如何将按钮值传递给另一个模块?承诺评估错误

How to pass button value to another module? Promise evaluation error

我想将按钮值传递给 mod_test_server 并使用 renderPrintmod_test_server 中显示它。不知道为什么我只能传递一次它的值。下一次点击不会导致任何操作 - 不会传递任何值。我在控制台中看到的是这个奇怪的错误:

Warning in 'renderPrint(...)': restarting interrupted promise evaluation

我正在寻找解决方案,我认为它与承诺有关,但我从未遇到过这样的问题并使用了大量的反应性。为什么会这样?以及如何让它发挥作用?

这是可重现的示例:

library(shiny)
library(dplyr)


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

      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")
   btnClicked <- eventReactive(button(),{
                                button()})
   
   mod_test_server("test", btnClicked())   

}

shinyApp(ui = ui, server = server)

btnmod_test_server 模块中是反应性的。试试这个

# Server - table #
mod_test_server <- function(id, btn){
  moduleServer(id, function(input, output, session) {
    ns <- session$ns
    
    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")
  btnClicked <- eventReactive(button,{
    button})
  
  mod_test_server("test", btnClicked() )   
  
}

shinyApp(ui = ui, server = server)