通过导航到 navbarPage 中的特定 tabPanel 触发 R Shiny 反应式

Posted

技术标签:

【中文标题】通过导航到 navbarPage 中的特定 tabPanel 触发 R Shiny 反应式【英文标题】:R Shiny reactive triggered by navigating to particular tabPanel in navbarPage 【发布时间】:2018-08-03 23:16:48 【问题描述】:

写一个闪亮的问题。我有一个 navbarPage,id = "navbar",并且在 navbarMenu 中,用户可以从几个 tabPanel 中选择一个。每个 tabPanel 都分配了一个值(值 = 1、值 = 2 等)。所以 input$navbar 是与所选 tabPanel 的值的反应值。

我定义了一个响应式表达式,它对 tabPanel 的变化做出反应(根据 input$navbar 做出反应)。我真正想要的是对导航到特定的 tabPanel 做出反应,而不是从该 tabPanel 导航 离开。因此,当 input$navbar 从 1 更改为 2 时,我想要一个反应,但是当从 2 更改为 1 时没有反应。我怎样才能做到这一点?

这是我的代码的相关 sn-p,我认为我不需要一个完整的可重现示例,但如果我错了请告诉我。

#ui snippet
navbarPage(id = "navbar",
        navbarMenu(title = "Title",
                    tabPanel(title = "tp1", value = 1),
                    tabPanel(title = "tp2", value = 2),
                    #more tabPanels and ui stuff...

#server snippet
rctvfx <- reactive(
              #want this to react only when input$navbar changes from ==1 to ==2
              input$navbar 
              isolate( 
                  #do stuff 
              )
          )

【问题讨论】:

【参考方案1】:

您可以使用if 语句。这确保代码仅在用户导航到相应的tab 时运行。

library(shiny)

shinyApp(
  ui = navbarPage(
    "App Title",
    id = "navbar",
    tabPanel("Plot"),
    navbarMenu(
      "More",
      tabPanel("Summary"),
      "----",
      "Section header",
      tabPanel("Table")
    )
  ),
  server = function(input, output)
    observe(
      if (req(input$navbar) == "Table")
        message("Table has been selected")
      if (req(input$navbar) == "Plot")
        message("Plot has been selected")
    )
  
)

我建议使用 observe 而不是 reactive 来确保即使所有响应式观察者都处于空闲状态也能正常运行。

【讨论】:

【参考方案2】:

与上述相同答案的另一个例子

library(shiny)

shinyApp(
    ui = navbarPage(
        "App Title",
        id = "navbar",
        tabPanel("Plot"),
        navbarMenu(
            "More",
            tabPanel("Summary"),
            tabPanel("Table"),
            mainPanel(dataTableOutput("d"))
        )
    ),
    server = function(input, output)
        output$d = renderDataTable(
            
            if ((input$navbar) == "Table") 
                head(mtcars) 
                 else 
                    ((input$navbar) == "Plot")
                head(iris)
                
        )
    
)

【讨论】:

以上是关于通过导航到 navbarPage 中的特定 tabPanel 触发 R Shiny 反应式的主要内容,如果未能解决你的问题,请参考以下文章

外部链接到 Shiny App 中的特定 tabPanel

react-native-tab-view 从反应导航屏幕跳转到特定选项卡

将锚标记哈希到特定的导航选项卡

使用 Bootstrap 导航选项卡从另一个选项卡跳转到特定选项卡

如何在 vue 路由中导航到 Bootstrap-vue 选项卡中的特定选项卡?

Laravel 6 导航选项卡无法导航到仅显示在 url (myweb/pages#tab1) 中的选项卡