2016-03-01 166 views
0

我試圖在導航欄中單擊其他選項卡時將新選項卡添加到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) 
    }) 
} 

回答

1

怎麼樣?

### 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重命名你生成的面板來說明它是如何工作的。

如果你想應用這個解決方案,我建議你考慮一個模式如何命名你的選項卡,以便你可以明確地調用它們。

請問,如果有什麼不清楚的地方!