Call updateTabItems from inside Shiny module

倖福魔咒の 提交于 2020-04-16 12:50:07

问题


In my shiny app I have lots of valueBoxes, each representing a tabItem in the sidebar of the shinydashboard. When clicking on the valueBox the page should move to the correct tab.

Instead of copypasting the code lots of times I wrote a reusable module which renders the valueBox and changes the class of the valueBox into an actionButton. In the server part I have included an observeEvent which calls updateTabItems when the valueBox is clicked. But when clicked nothing happens. It seems that the module cannot manipulate the dashboard sidebar.

library(shiny)
library(shinydashboard)

value_box_output <- function(.id) {
  ns <- NS(.id)
  valueBoxOutput(ns("overview.box"))
}

value_box <- function(input, output, session, .value, .subtitle, .tab.name) {
  ns <- session$ns

  output$overview.box <- renderValueBox({
    box1 <- valueBox(
      .value,
      .subtitle,
      href = "#",
      width = NULL
    )
    box1$children[[1]]$attribs$class <- "action-button"
    box1$children[[1]]$attribs$id <- ns("button")
    box1
  })

  observeEvent(input$button, {
    print("clicked")
    updateTabItems(session, inputId = "tabs", selected = .tab.name)
  })
}


ui <- dashboardPage(
  dashboardHeader(title = "Title"),
  dashboardSidebar(
    sidebarMenu(
    id = "tabs",
    menuItem("Overview", tabName = "Overview"),
    menuItem("Tab 1", tabName = "Tab_1")
    )
  ),
  dashboardBody(
    tabItems(
      tabItem("Overview", value_box_output("tab")),
      tabItem("Tab_1")
    )
  )
)

server <- function(input, output, session) {
  callModule(value_box,
             "tab",
             .value = 33,
             .subtitle = "Tab 1",
             .tab.name = "Tab_1")
}

shinyApp(ui, server)

回答1:


You can find the answer in this post: Accessing parent namespace inside a shiny module

Basically, in updateTabItems() inside a moulde, you need to call the parent's session, not the session of the modul.

Thus, add a variable for your session to callModule() and call it in updateTabItems().



来源:https://stackoverflow.com/questions/51039055/call-updatetabitems-from-inside-shiny-module

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!