首页 > 解决方案 > 带有 Shiny 模块的 updateTabsetPanel

问题描述

updateTabsetPanel在Shiny 模块中调用有问题,没有问题也可以正常工作。

library(shiny)

mod_ui <- function(id){
  ns <- NS(id)
  tagList(
    actionButton(ns("back"), "back")
  )
}

mod <- function(input, output, session){
  observeEvent(input$back, {
    print("Button click, go back to home tab")
    updateTabsetPanel(session = session, inputId = "tabs", selected = "home")
  })
}

ui <- navbarPage(
  "example",
  id = "tabs",
  tabPanel(
    "home",
    h4("updateTabsetPanel does not work with modules"),
    h5("But the button below does"),
    actionButton("switch", "switch")
  ),
  tabPanel(
    "secondtab",
    mod_ui("second")
  )
)

server <- function(input, output, session){
  callModule(mod, "second")
  observeEvent(input$switch, {
    updateTabsetPanel(session = session, inputId = "tabs", selected = "secondtab")
  })
}

shinyApp(ui, server)

标签: rshiny

解决方案


模块的设计方式使得每个模块都是绝对独立的。如果您需要与调用模块的父级通信,则需要显式传递参数。这是如何完成的:

library(shiny)

mod_ui <- function(id){
  ns <- NS(id)
  tagList(
    actionButton(ns("back"), "back")
  )
}

mod <- function(input, output, session,parent_session){
  observeEvent(input$back, {
    print("Button click, go back to home tab")
    updateTabsetPanel(session = parent_session, inputId = "tabs", selected = "home")
  })
}

ui <- navbarPage(
  "example",
  id = "tabs",
  tabPanel(
    "home",
    h4("updateTabsetPanel does not work with modules"),
    h5("But the button below does"),
    actionButton("switch", "switch")
  ),
  tabPanel(
    "secondtab",
    mod_ui("second")
  )
)

server <- function(input, output, session){
  callModule(mod, "second",parent_session = session)
  observeEvent(input$switch, {
    updateTabsetPanel(session = session, inputId = "tabs", selected = "secondtab")
  })
}

shinyApp(ui, server)

session级显式传递给模块。


推荐阅读