簡體   English   中英

在Shiny中使用帶有嵌套tabPanel的conditionalPanels

[英]Using conditionalPanels with nested tabPanel in Shiny

我正在構建一個R Shiny Web應用程序,以幫助進行數據探索。 我的主頁上有一排標簽,然后是一排子標簽: 在此處輸入圖片說明

我想顯示一個面板,為用戶提供不同的輸入以供選擇以創建不同的圖表(例如,選擇“ Bar Chart選項卡時,我想為數據集列提供一個下拉列表,並且當“ Histogram為選擇后,我希望有一個用於確定箱數的滑塊。

我可以使用第一級標簽來做到這一點。 例如, ui.R以下代碼ui.R我可以在選擇“ Correlation時輕松地渲染面板:

conditionalPanel(
    condition = "input.tabs == 'correlation'",

    actionButton("generate_correlation", "Generate Heat Map")
  )

server.R

      tabsetPanel(
        id = "tabs",

        tabPanel("Correlation", value = "correlation",
                 plotOutput("correlation"))

... code for other tabs...

但是,我不知道如何訪問嵌套的tabPanel返回的值(例如, Bar ChartHistogram )。 我試圖使用此代碼:

tabPanel(
  "Visualize",
  value = "visualize",

  tabsetPanel(
    id = "vis_tabs",
    tabPanel("Bar Chart", value = "bar_tab",# <-- want a conditionalPanel to appear when this tab is selected

             plotOutput("bar_chart")),         
    tabPanel("Histogram", value = "histogram_tab",
             plotOutput("histogram"))
  )
),

使用以下conditionalPanel

  conditionalPanel(
    condition = "input.vis_tabs" == "bar_tab",
    #CODE HERE FOR INPUT STUFF TO APPEAR WHEN BAR CHART TAB IS SELECTED
  ),

但是現在,上面的conditionalPanel 始終在評估為true。 這篇SO帖子是我能找到的最接近答案的帖子 ,並且因為它專注於顯示輸出,所以它並沒有太大幫助。

我的猜測是,由於第二級選項卡是在第一級選項卡的范圍內定義的,因此它返回的值在“全局” ui.Rserver.R范圍中不可用。 但是,如果是這種情況,我希望conditionalPanel始終評估為false,而當前評估為始終為true!

我也知道要評估的條件是在JavaScript中,所以嵌套的制表符條件應該像

input.tabs.vis_tabs == "bar_tab"

我假設input是某些Input JS對象的實例,並且tabs是字符串屬性,當用戶選擇其他選項卡時會動態設置該屬性。

這是基於@Yu Chen答案的非HTML專家(如我:D)的完整示例:

runApp(list(
  ui = shinyUI( fluidPage(

sidebarLayout( 
  sidebarPanel(
    conditionalPanel(condition="input.conditioned == 0",helpText("This is navnarMenu 0")),
    conditionalPanel(condition="input.conditioned == 1",helpText("This is navnarMenu 1")),
    conditionalPanel(condition= "input.Guidelines == 2.1 && input.conditioned == 2",helpText("This is navnarMenu 2")),
    conditionalPanel(condition= "input.Guidelines == 2.2 && input.conditioned == 2",helpText("This is navnarMenu 3"))),

  mainPanel(tabsetPanel(id='conditioned',

                        tabPanel("About", value=0),                   

                        tabPanel("Tab 1",value=1,tabsetPanel(
                          tabPanel("Tab 1.1"),
                          tabPanel("Tab 1.2", tabsetPanel(
                            tabPanel("Tab 1.2.1"),
                            tabPanel("Tab 1.2.2"))))),

tabPanel("Guidelines",value = 2, tabsetPanel( id = "Guidelines",         
                   navbarMenu("Tab 2.1",
                                   tabPanel("Tab 2.1.1",value=2.1),
                                   tabPanel("Tab 2.1.2",value=2.1)),

                 navbarMenu("Tab 2.2",
                                   tabPanel("Tab 2.2.1",value=2.2),
                                   tabPanel("Tab 2.2.2",value=2.2))))

  ))))),

server = function(input, output, session) {}


))

我從一個有用的SO用戶評論中弄清楚了。 首先,我的條件陳述中有一個錯字:

condition = "input.vis_tabs" == "bar_tab",

需要是

condition = "input.vis_tabs == 'bar_tab'"

從那里,所有tabsetPanel值都可以直接從input引用(它們只需要一個唯一的id ):

  conditionalPanel(
    condition = "input.vis_tabs == 'bar_tab' && input.tabs == 'visualize'",
    checkboxInput("save_data", "Save Data", FALSE)
  )

您需要確保將兩個條件都評估為TRUE ,因為否則,如果bar_tab是第一個嵌套選項卡,則默認情況下會自動選擇它。 您希望僅在選擇了相應的第一級選項卡和第二級選項卡時才彈出條件面板。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM