web-dev-qa-db-ja.com

R Shiny-tabPanelをtabsetPanelに動的に追加します(renderUIを使用)

ユーザーが特定の入力をしたときに生成されるtabsetPanelを使用する光沢のあるアプリケーションを開発しています。したがって、renderUI関数を使用してtabsetPanelを表示/非表示にします。

私の今の闘争は、number oftabPanel要素(tabsetPanelの引数)ユーザーの入力にも依存しますで、時々:必要なものは1つ、それ以外の場合はtabPanelsがさらに必要です。

作り方conditionPanelを含めるか、またはtabsetPanel引数に単純なif()...条件を含めようとしましたが、(当然のことながら...)動作しませんでした。

40
Marta Karas

どうぞ。コードはかなり自明です。

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)
    })
  }
))
67
Ramnath

動的にtabPanelswithoutUIを追加する方法があります。これは、renderUIを使用したバージョンほど明白ではありません。私は、任意の(リストの)tabPanelをtabset/navbarに追加する関数addTabToTabsetを作成しました。

このアプローチには、renderUIを使用するよりもadvantagesのセットがあります。

  • 新しいパネルが追加されるたびに、既存のtabPanelは再レンダリングされません。 (もっと早く)
  • したがって、既存のパネル内のすべての入力変数をリセットしません。 (回避策を格納する変数は必要ありません)
  • パネルの内容の構造は個別に選択できます。 (lapply-renderUIバージョンでは、すべてのパネルはある程度均一でなければなりません。)

ソリューションとコードサンプルは、答え here にあります。要求があれば、ここにコードを投稿することもできます。

3
K. Rohde