如何确保闪亮的应用程序在使用模块时知道当前打开了哪个选项卡?

时间:2017-07-20 11:07:27

标签: r shiny shiny-server shinydashboard

我在我的闪亮应用中使用模块来显示不同tabPanel的内容。我希望能够通过单击一个按钮前往第二个选项卡。我有以下代码:

library(shiny)
library(shinydashboard)

moduleUI <- function(id){

  ns <- NS(id)
  sidebarPanel(
    actionButton(ns("action1"), label = "Go to tab 2")
  )
}

module <- function(input, output, session, openTab){

  observeEvent(input$action1, {
    openTab("two")
  })

  return(openTab)
}

ui <- fluidPage(
  navlistPanel(id = "tabsPanel",
               tabPanel("one", moduleUI("first")),
               tabPanel("two", moduleUI("second"))
  ))

server <- function(input, output, session){
  openTab <- reactiveVal()
  openTab("one")

  openTab <- callModule(module,"first", openTab)
  openTab <- callModule(module,"second", openTab)

  observeEvent(openTab(), {
    updateTabItems(session, "tabsPanel", openTab())
  })
}

shinyApp(ui = ui, server = server)

然而,这仅适用一次。我认为问题是模块不知道应用程序中的标签何时更改。因此,我正在寻找一种方法来确保模块知道打开了哪个选项卡,以便actionButton可以运行一次。 我考虑过使用input $ tabsPanel,但我不知道如何实现它。 非常感谢帮助。

1 个答案:

答案 0 :(得分:1)

问题是,一旦用户手动切换回选项卡1, openTab()就不会更新。因此,当您再次单击actionButton时,openTab会从“两个”更改为“两个”(即它保持不变),因此不会触发您的observeEvent。

您可以添加:

  observeEvent(input$tabsPanel,{
    openTab(input$tabsPanel)
  })

因此,当用户手动更改回tab1(或任何其他选项卡)时,openTab reactiveVal也会更新。

顺便说一下,你不需要模块来做你想做的事情,但我认为你有一个特定的理由来使用它们。对于任何想要实现同样但不需要模块的人来说:

library(shiny)
library(shinydashboard) 

ui <- fluidPage(
  sidebarPanel(
    actionButton(ns("action1"), label = "Go to tab 2")),
  navlistPanel(id = "tabsPanel",
               tabPanel("one"),
               tabPanel("two")
  ))

server <- function(input, output, session){ 
  observeEvent(input$action1, {
    updateTabItems(session, "tabsPanel", "two")
  })
}

shinyApp(ui = ui, server = server)