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

R Shiny reactive triggered by navigating to particular tabPanel in navbarPage

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

我定义了一个反应式表达式,它对 tabPanel 的变化做出反应(根据输入 $navbar 做出反应)。我真正想要的是让它对导航到特定的 tabPanel 做出反应,而不是从该 tabPanel 导航 away。所以,当 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 
              })
          })

您可以使用 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 来确保即使反应的所有观察者都处于空闲状态,一切都会运行。

同上答案的另一个例子

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)
                }
        })
    }
)