如何将按钮值传递给另一个模块?承诺评估错误
How to pass button value to another module? Promise evaluation error
我想将按钮值传递给 mod_test_server
并使用 renderPrint
在 mod_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)
btn
在 mod_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)
我想将按钮值传递给 mod_test_server
并使用 renderPrint
在 mod_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)
btn
在 mod_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)