首页 > 解决方案 > 如果输入通过,updateTabItems 在模块中不起作用

问题描述

我想创建一个函数/一个模块来更新标签集项目。

我知道这个这个问题,但我的问题与如何处理按钮输入有关updateTabItems

在这里你可以找到一个例子:

library(shiny)
library(shinydashboard)
library(shinydashboardPlus)

mod_updateTabset <- function(
  input, output, session, triggerId, dashboardId, tab, parent
) {
  observeEvent(triggerId, {
    updateTabItems(parent, dashboardId, selected = tab)
  })
}

ui <- dashboardPagePlus(
  header = dashboardHeaderPlus(),
  sidebar = dashboardSidebar(
    sidebarMenu(
      id = 'Tabs', 
      menuItem("Tab 01", tabName = "tab01", icon = icon("dice-one")),
      menuItem("Tab 02", tabName = "tab02", icon = icon("dice-two"))
    )
  ),
  body = dashboardBody(
    tabItems(
      tabItem(
        tabName = "tab01",
        actionButton("updateButton", label = "To Tab02")
      ),
      tabItem(
        tabName = "tab02",
        h4("New Tab")
      )
    )
  )
)

server <- function(input, output, session) {
  callModule(
    mod_updateTabset,
    "updateLink",
    triggerId = input$updateButton,
    dashboardId = "Tabs", 
    tab = "tab02",
    parent = session
  )
}

shinyApp(ui = ui, server = server)

我知道它在创建时工作mod_updateTabset_UI,将 actionButton 转移到模块。这就是为什么我认为问题在于按钮处理的原因。

不过,我希望有一个功能/模块可以处理所有类型的链接、按钮等来更新选项卡项目,而不仅仅是一个按钮

标签: rshinyshinydashboard

解决方案


对于遇到相同问题的任何人:调用模块时需要使用reactive()fortriggerId

callModule(
  mod_updateTabset,
  "updateLink",
  triggerId = reactive(input$updateButton),
  dashboardId = "Tabs", 
  tab = "tab02",
  parent = session
)

然后模块需要处理一个反应值:

mod_updateTabset <- function(
  input, output, session, triggerId, dashboardId, tab, parent
) {
  observeEvent(triggerId(), {
    updateTabItems(parent, dashboardId, selected = tab)
  })
}

推荐阅读