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)
推荐阅读
- vega-lite - Vega-Lite 重复图表中的缩放、跟踪
- javascript - jquery javascript将值传递给html页面
- python - 端口扫描器上的 Python 语法问题
- javascript - 如何解决javascript的功能
- c++ - MISRA 5-2-1 规则需要后缀表达式?
- spring-boot - 如何在 Spring Boot AMQP 中获取 Channel 对象并创建“x-consistent-hash”类型的 Exchange
- python - 我想使用python multiprocessing 处理多个文件,但下面的代码一次又一次地处理所有文件
- python - 获取每次提交的每个文件子集的更改/删除行数的快速方法
- android - 如何从 android pie 中的 content:// 方案中获取文件对象?
- oracle - Oracle - 验证表是否存在与具有表名值的列同名