通过导航到 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)
}
})
}
)
写一个闪亮的问题。我有一个 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)
}
})
}
)