【问题标题】:Using conditionalPanels with nested tabPanel in Shiny在 Shiny 中使用带有嵌套 tabPanel 的条件面板
【发布时间】:2018-03-02 04:59:58
【问题描述】:

我正在构建一个 R Shiny 网络应用程序来帮助进行数据探索。我有一个带有一行标签的主页,然后是一行子标签:

我希望有一个面板,为用户提供不同的输入来选择以创建不同的图表(例如,选择@ 987654324选项卡时,我希望有一个数据集列的下拉列表,当Histogram 被选中时,我想要一个用于显示垃圾箱数量的滑块。

我可以使用第一级选项卡做到这一点。例如,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 Chart 或 Histogram)。我尝试使用此代码:

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
  ),

但现在,上述条件面板总是评估为真。这个SO post 是我能找到的最接近答案的,它确实没有太大帮助,因为它专注于显示输出。

我的猜测是,由于二级选项卡是在一级选项卡的范围内定义的,因此它返回的值在“全局”ui.R 或server.R 范围内不可用。但如果是这种情况,我希望 conditionalPanel 始终评估为 false,而它当前评估为始终为 true!

我也知道被评估的条件是在 JavaScript 中,所以嵌套的选项卡条件会是这样的

input.tabs.vis_tabs == "bar_tab"

?我假设input 是一些Input JS 对象的实例,tabs 是一个字符串属性,当用户选择不同的选项卡时会动态设置。

【问题讨论】:

  • condition = "input.vis_tabs" == "bar_tab" 包含一个错字 ;) 是否由 condition = "input.vis_tabs == 'bar_tab' " 解决?否则请提供可重现的示例。
  • @BigDataScientist 想通了。你是对的 - 你还需要评估条件中的第一级和第二级选项卡,因为默认情况下嵌套级别的第一个选项卡被选中。

标签: r shiny


【解决方案1】:

这是基于@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) {}


))

【讨论】:

【解决方案2】:

我从一个有用的 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 是第一个嵌套选项卡,则默认情况下会自动选择它。您希望该条件面板仅在您选择了适当的第一级选项卡和第二级选项卡时才弹出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 2018-11-29
    • 2016-07-21
    • 2015-07-07
    • 2016-06-04
    相关资源
    最近更新 更多