首页 > 解决方案 > 如何在模块之间传递按钮的“点击”动作?

问题描述

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

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 出现。

标签: rshinyshinymodules

解决方案


您的 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)

推荐阅读