通过导航到 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 反应式的主要内容,如果未能解决你的问题,请参考以下文章
react-native-tab-view 从反应导航屏幕跳转到特定选项卡
使用 Bootstrap 导航选项卡从另一个选项卡跳转到特定选项卡