如何在模块之间传递按钮的“点击”动作?

问题描述

我在一个模块中有一个按钮。当我单击按钮时,应出现一个面板。该面板放置在另一个模块中。我尝试使用一些反应性在模块之间传递按钮的“单击”操作,但我的代码无法正常工作。这是一个可行的例子:

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,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,session) {
   btnVal <- mod_btn_server("test-btn")
   mod_body_server("test-body",btnOne = btnVal$btnPanel)
}


shinyApp(ui = ui,server = server)

我尝试了各种方法将按钮“点击”传递给另一个模块,但它不起作用。我也检查了这个 eventReactive in shiny module 但在我的例子中我不想返回值作为输出,只是让一些 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,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,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)