如何在 R Shin 中没有底部的 NavBar 选项卡之间切换

How to swich between NavBar Tabs without bottom in R Shin

我正在 R shiny 中创建一个包含多个选项卡的仪表板,可能在一段时间后,仪表板会自动从 table 1 切换到选项卡 2,而无需按钮。

shinyDashboards 有一个名为 updateTabItems

的函数

在服务器中使用它根据触发它的事件进行更新。

这是一个完整的示例。

  1. 定时器设置为 10 秒。您可以在切换到选项卡 2 () 之前查看剩余时间。
  2. 时间过去后,第一个 observe 使用 updateTabsetPanel 切换选项卡。计时器“停止”(在本例中被忽略)。
  3. 如果用户手动切换标签页,计时器将在秒后停止 observe

此解决方案使用 shiny::tabsetPanel (more)。如果您更喜欢 shinydashboard::tabItems,则必须使用 updateTabItems 而不是 updateTabsetPanel

library(shiny)

ui <- fluidPage(
  # App title ----
  titlePanel("Auto Tabsets"),
  
  # Sidebar layout with input and output definitions ----
  sidebarLayout(
    
    # Sidebar panel for inputs ----
    sidebarPanel(
    ),
    
    # Main panel for displaying outputs ----
    mainPanel(
      
      # Output: Tabset w/ plot, summary, and table ----
      tabsetPanel(id = "inTabset", type = "tabs",
                  tabPanel("Tab 1", verbatimTextOutput("timeleft")),
                  tabPanel("Tab 2", verbatimTextOutput("data"))
      )
    )
  )
)

server <- function(input, output, session) {
  # Initialize the timer, 10 seconds, active.
  timer <- reactiveVal(10) # in seconds
  active <- reactiveVal(TRUE)
  
  
  # Output the time left and timer status on tab 1
  output$timeleft <- renderText({
    paste("Time left: ", timer(), " - Timer ", ifelse(active(), "On", "Off"))
  })
  
  # Output the time left and timer status on tab 2
  output$data <- renderText({
    paste("Time left: ", timer(), " - Timer ", ifelse(active(), "On", "Off"))
  })
  
  
  
  # TIMER
  # observer that invalidates every second. If timer is active, decrease by one.
  observe({
    invalidateLater(1000, session)
    isolate({
      if(active())
      {
        timer(timer()-1)
        if(timer() < 1)
        {
          active(FALSE)
          updateTabsetPanel(session, "inTabset", selected = "Tab 2")
        }
      }
    })
  })
  
  
  # TABSET
  # Stop the timer if the user changes the tab manually
  observe({
    if (input$inTabset != "Tab 1")
      isolate(active(FALSE))
  })
}

shinyApp(ui, server)