r语言 - 如何在模块之间传递按钮的"点击"操作?



我在一个模块中有一个按钮。当我点击按钮一个面板应该出现。该面板放置在另一个模块中。我试图通过使用一些反应性模块之间的按钮的"点击"动作,但我的代码不能正常工作。下面是一个可行的例子:

library(shiny)
library(shinyjs)
# UI #
mod_btn_UI <- function(id) {

ns <- NS(id)
actionButton(ns("btn"), "Click me!")

}

mod_btn_server <- function(id){
moduleServer(id, function(input, output, session) {

btnPanel <- eventReactive(input$btn,{
return()
})
})
}

mod_body_UI <- function(id) {
ns <- NS(id)

shinyjs::useShinyjs()
shinyjs::hidden(absolutePanel(ns("panel"),
tagList(shinyWidgets::actionBttn(inputId = "XYZ", icon = icon("chart-line")))))

}
# Server #
mod_body_server <- function(id, btnOne){
moduleServer(id, function(input, output, session) {

observeEvent(btnOne(), {
shinyjs::toggle(id = "panel")
})
})
}

# App #
ui <- fluidPage(

shinyjs::useShinyjs(),
tagList(
mod_btn_UI("test-btn"),
mod_body_UI("test-body")
)
)
server <- function(input, output, session) {
btnVal <- mod_btn_server("test-btn")
mod_body_server("test-body", btnOne = btnVal$btnPanel)
}

shinyApp(ui = ui, server = server)

我尝试了各种方法来传递按钮'点击'到另一个模块,但它不起作用。我也检查了这个eventReactive在闪亮模块,但在我的例子中,我不想返回值作为输出,只是让一些GUI出现。

您的btn通行证正常工作。同时,shinyjs::toggle现在工作了。试试这个

library(shiny)
library(shinyjs)
moduleServer <- function(id, module) {
callModule(module, id)
}
# UI #
mod_btn_UI <- function(id) {
ns <- NS(id)
tagList(
actionButton(ns("btn"), "Click me!")
)
}

mod_btn_server <- function(id){
moduleServer(id, function(input, output, session) {
# btnPanel <- eventReactive(input$btn,{
#   cars ## return()
# })
b1 <- reactive(input$btn)
})
}

mod_body_UI <- function(id) {
ns <- NS(id)
shinyjs::useShinyjs()
div(id = "advanced" ,
tagList(
shinyjs::hidden(plotOutput(ns("plot2")))
))
}
# Server #
mod_body_server <- function(id, btnOne){
moduleServer(id, function(input, output, session) {
ns <- session$ns
output$plot2 <- renderPlot({hist(rnorm(500))})

observeEvent(btnOne(), {
shinyjs::toggle(id = "plot2")   ## toggle is now working
})
})
}

# App #
ui <- fluidPage(
shinyjs::useShinyjs(),
tagList(
mod_btn_UI("test-btn"),
mod_body_UI("test-body")
)
)
server <- function(input, output, session) {
btnVal <- mod_btn_server("test-btn")
#mod_body_server("test-body", btnOne = btnVal$btnPanel)
mod_body_server("test-body", btnVal )
}
shinyApp(ui = ui, server = server)

最新更新