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

mb1*_*127 3 r shiny reactive

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

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

这是我的代码的相关片段,我认为我不需要为此提供完整的可重现示例,但如果我错了,请告诉我。

#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 
              })
          })
Run Code Online (Sandbox Code Playgroud)

Gre*_*lia 5

您可以使用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")
    })
  }
)
Run Code Online (Sandbox Code Playgroud)

我会建议使用observe而不是reactive确保一切运行,即使所有反应器的观察者都空闲。