2013-10-19 54 views
33

我正在開發一個閃亮的應用程序,其中使用tabsetPanel,它是在用戶輸入某個特定輸入時生成的。因此,我想使用renderUI函數來使tabsetPanel出現/消失。R Shiny - 將tabPanel動態添加到tabsetPanel(使用renderUI)

我現在的鬥爭是tabPanel元素(的tabsetPanel參數)還取決於用戶輸入,在路上:我有時需要1一個,其他時間我想更多tabPanels

如何製作它?我嘗試了conditionPanel或在tabsetPanel參數中包含簡單的if()...條件,但它(不出意外......)無效。

回答

57

在這裏,你去。代碼相當自我解釋。

library(shiny) 
runApp(list(
    ui = pageWithSidebar(
    headerPanel('Dynamic Tabs'), 
    sidebarPanel(
     numericInput("nTabs", 'No. of Tabs', 5) 
    ), 
    mainPanel(
     uiOutput('mytabs') 
    ) 
), 
    server = function(input, output, session){ 
    output$mytabs = renderUI({ 
     nTabs = input$nTabs 
     myTabs = lapply(paste('Tab', 1: nTabs), tabPanel) 
     do.call(tabsetPanel, myTabs) 
    }) 
    } 
)) 
+0

**拉姆納特**,這使我的一天,它的偉大工程!萬分感謝!! –

+0

很高興爲您服務。如果您對代碼本身有任何疑問,請在此處發帖。 – Ramnath

+0

附加:一旦您添加了選項卡,將相同的'uiOutput'添加到所有選項卡的正確方法是什麼,但是要使每個選項卡中的值都具有唯一性?或者這是不同的? 如果添加一個'output $ base_tab_ui'並在每個中渲染它們,那麼它們都爲每個選項卡保持相同的'input $ value'。有沒有辦法使這些獨特的不同輸入變量名稱? – Jenks

2

有一種方法來動態地添加tabPanels 沒有 renderUI,這可能不是那麼明顯與renderUI版本。我寫了一個函數addTabToTabset它將追加任何(列表)tabPanel(s)到一個標籤集/導航欄。

這種方法有一組優點使用renderUI過來:

  • 現有tabPanels不每次添加新的面板的時間重新呈現。 (更快)
  • 因此,不會重置現有面板內的所有輸入變量。 (不需要變量存儲變通辦法)
  • 面板內容的結構可以單獨選擇。 (在lapply - renderUI版本中,所有面板必須有點統一。)

解答和代碼示例可以在答案here中找到。如果有要求,我也可以在這裏發佈代碼。