【问题标题】:How to use shiny conditional panel如何使用闪亮的条件面板
【发布时间】:2014-08-15 15:18:24
【问题描述】:

您好,目前我有一个这样的示例数据集

 df<- data.frame(site = c('A1', 'A1', 'A1', 'B1', 'B1','B1','B1','C1','C1'), 
                 part = c('a1', 'a1', 'a2', 'b1', 'b1', 'b2','b3','c1','c2'),
                 value = c(2,3,4,5,6,7,8,9,10))

> df
site part value
  A1   a1     2
  A1   a1     3
  A1   a2     4
  B1   b1     5
  B1   b1     6
  B1   b2     7
  B1   b3     8
  C1   c1     9
  C1   c2    10

我想在闪亮的用户界面中放置一个带有两个选择框的侧栏。一个是“选择”站点,另一个是“部分”。

shinyUI(

fluidPage(    

titlePanel("Choose Site, part"),

sidebarLayout(      


  sidebarPanel(
    selectInput("select_site", label = "Select Site", 
                choices = unique(df$site), 
                selected = unique(df$site)[1]),

      selectInput("select_part", label = "Select Part", 
                  choices = unique(df$part), 
                  selected = unique(df$part)[1])

  ),

  mainPanel(
    plotOutput("example")  
  )

)
)
)

目标是当我在“select_site”中选择A1时,我只能在“select_part”中选择a1或a2。然而,无论我如何在“select_site”中选择,这段代码现在都可以在“select_part”中选择a1、a2、b1、b2、b3、c1、c2。

在实际数据集中,站点和部件比这个示例多得多,因此我正在寻找一种通用方法来识别每个站点中的部件,而不是自己输入名称。

谁能帮我修改这段代码?

提前致谢

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    您应该查看updateSelectInput 而不是conditionalPanelconditionalPanel 所做的是完全隐藏一些 UI 元素,而不是在 selectInput 中隐藏一些选项。

    在您的情况下,您可以在server.R 中创建一个观察者,以监视用户对select_site 所做的选择。

    ui.R

    shinyUI(
      fluidPage(    
        titlePanel("Choose Site, part"),
        sidebarLayout(      
    
    
          sidebarPanel(
            selectInput("select_site", label = "Select Site", 
                        choices = list("A1"="A1", "B1"="B1", "C1"="C1"), 
                        selected = "A1"),
    
            selectInput("select_part", label = "Select Part", 
                        choices = NULL, 
                        selected = NULL) # empty for now, will be updated in server.R
    
          ),
    
          mainPanel(
            plotOutput("example")  
          )
    
        )
      )
    )
    

    现在创建一个global.R 以与ui.Rserver.R 共享df 对象。

    global.R

    df <- data.frame(site = c('A1', 'A1', 'A1', 'B1', 'B1','B1','B1','C1','C1'), 
                     part = c('a1', 'a1', 'a2', 'b1', 'b1', 'b2','b3','c1','c2'),
                     value = c(2,3,4,5,6,7,8,9,10))
    
    site_choices <- as.list(df$site)
    names(site_choices) <- df$site
    

    最后,在服务器端,当select_site 的选择发生变化时,使用观察者 更新select_part 的选项。

    服务器.R

    library(shiny)
    
    shinyServer(function(input, output, session){
      observe({
        if (input$select_site != "") {
          part_choices <- as.list(df$part[df$site == input$select_site])
          names(part_choices) <- df$part[df$site == input$select_site]
    
          updateSelectInput(session, "select_part", choices=part_choices)
        }
      })
    })
    

    最后的评论

    您可以使用conditionalPanel,如果您有其他站点特定元素只想有条件地显示。 例如,如果站点A1 有一些在其他站点中不存在的非常特定的输入控件或输出元素,您可以将这些输入/输出元素包装在带有条件参数的condtionalPanel 中:condition="input.select_site == 'A1'"。 (请注意,您在这里使用. 而不是$,因为此条件是在您的浏览器中由 Javascript 评估的,而不是在 Shiny 中由 R 评估。)

    然后,一旦用户切换到其他站点,conditionalPanel 中的那些元素就会消失。 (更有趣的是,即使依赖的输入发生变化,隐藏的输出元素也不会被更新。因为更新用户不可见的东西几乎没有意义。)

    【讨论】:

    • 谢谢,这真的很有帮助
    猜你喜欢
    • 2017-04-29
    • 1970-01-01
    • 2016-04-10
    • 2021-04-06
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多