将选项卡动态添加到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。您的所有面板(在您的原始代码中)称为AddPanel1AddPanel2,如果您想选择一个面板,它将选择第一个具有此名称的面板(这是navbarMenu中的面板)。所以我不得不用Panel1Panel2重命名你生成的面板来说明它是如何工作的。

如果你想应用这个解决方案,我建议你考虑一个模式如何命名你的选项卡,以便你可以明确地调用它们。

请问,如果有什么不清楚的地方!