将选项卡动态添加到navbarPage并选择新选项卡
问题描述:
我试图在导航栏中单击其他选项卡时将新选项卡添加到shiny的导航栏页面。将选项卡动态添加到navbarPage并选择新选项卡
以下工作如预期,但我想跳到新添加的选项卡(而不是跳回到“家”)。
ui.R
library(shiny)
shinyUI(
fillPage(
uiOutput("updateableNavbar")
)
)
server.R
function(input, output, session) {
navbarParams <- reactiveValues(
params = list(
id = "navbar",
title = "navbar",
home = tabPanel("Home", titlePanel("Home")),
add = navbarMenu("AddPanels",
tabPanel("AddPanel1", titlePanel("AddPanel1")),
tabPanel("AddPanel2", titlePanel("AddPanel2"))
)
)
)
lastPanelKlicked <- NULL
observe({
if(!is.null(input$navbar) && substr(input$navbar, 1, 8) == "AddPanel" &&
(is.null(lastPanelKlicked) || lastPanelKlicked != input$navbar)) {
lastPanelKlicked <<- input$navbar
print(input$navbar)
params <- navbarParams$params
params[[length(params) + 1]] <- tabPanel(input$navbar, titlePanel(input$navbar))
names(params)[length(params)] <- input$navbar
navbarParams$params <<- params
}
})
output$updateableNavbar <- renderUI({
do.call(navbarPage, navbarParams$params)
})
}
答
怎么样?
### server.R
function(input, output, session) {
navbarParams <- reactiveValues(
params = list(
id = "navbar",
title = "navbar",
home = tabPanel("Home", titlePanel("Home")),
add = navbarMenu("AddPanels",
tabPanel("AddPanel1", titlePanel("AddPanel1")),
tabPanel("AddPanel2", titlePanel("AddPanel2"))
)
)
)
lastPanelKlicked <- NULL
makeReactiveBinding("lastPanelKlicked")
observe({
if(!is.null(input$navbar) && substr(input$navbar, 1, 8) == "AddPanel" &&
(is.null(lastPanelKlicked) || paste0("Add", lastPanelKlicked) != input$navbar)) {
# Above and below I changed the Value of lastPanelClicked
lastPanelKlicked <<- substr(input$navbar, 4, 1000)
print(lastPanelKlicked)
params <- navbarParams$params
params[[length(params) + 1]] <- tabPanel(lastPanelKlicked, titlePanel(lastPanelKlicked))
names(params)[length(params)] <- lastPanelKlicked
navbarParams$params <<- params
}
})
output$updateableNavbar <- renderUI({
do.call(navbarPage, navbarParams$params)
})
observe({
updateNavbarPage(session, "navbar", lastPanelKlicked)
})
}
我基本上做出lastPanelKlicked
反应,使得您的参数设定后,observe
语句来与updateNavbarPage
被触发。
但是,一个问题是,您多次指定tabPanel
-ID。您的所有面板(在您的原始代码中)称为AddPanel1
或AddPanel2
,如果您想选择一个面板,它将选择第一个具有此名称的面板(这是navbarMenu
中的面板)。所以我不得不用Panel1
或Panel2
重命名你生成的面板来说明它是如何工作的。
如果你想应用这个解决方案,我建议你考虑一个模式如何命名你的选项卡,以便你可以明确地调用它们。
请问,如果有什么不清楚的地方!