我正在开发一个更大的闪亮应用程序,我想包含一个用作菜单的模块。在此模块中,您可以在其他独立模块之间进行选择,并通过单击操作按钮来激活一个模块。选定的模块将以闪亮的模式弹出。
但是,我找不到将操作按钮输入从一个模块传递到另一个模块的好方法,因为如果我将其作为无功值传递,它将只能工作一次,而在关闭模块后将无法工作。我相信这是因为watchEvent不会在传递的反应值中记录任何变化。
您对如何解决此问题有任何建议吗?我需要完全不同的方法吗?
这是一个有效的示例:
# Load packages
library(shiny)
# mod_1 ui
# This modules task is to pass the button press to mod_3 in order to activate a modal there.
mod_1_ui <- function(id){
ns <- NS(id)
tagList(
actionButton(ns("actionbtn_1"), label = "actionbtn_1")
)
}
# mod_1 server
mod_1 <- function(input, output, session){
fruit <- reactiveVal(value = NULL)
observeEvent(input$actionbtn_1, {
fruit("banana")
})
return(list(
activate_1 = reactive({fruit()})
))
}
# mod_2 has no ui
# This modules' task is to recieve the action button press from mod_1 and activate the modal if it is pressed.
mod_2 <- function(input, output, session, activate_1, activate_2){
modal <- function() {
ns <- session$ns
modalDialog(
footer = actionButton(ns("close_modal"), label = "Close modal"),
textOutput(ns("fruit"))
)
}
observeEvent(activate_1(), {
if(activate_1() == "banana") {
showModal(modal())}
})
observeEvent(input$close_modal, {
removeModal()
})
output$fruit <- renderText({
paste("first mod:", activate_1())
})
}
# app ui
app_ui <-
fluidPage(
fluidRow(
mod_1_ui("mod_1")
)
)
# app server
app_server <- function(input, output,session) {
rv <- callModule(mod_1, "mod_1")
callModule(mod_2, "mod_2", activate_1 = rv$activate_1)
}
# running the app
shinyApp(app_ui, app_server)