如何使用闪亮的条件面板

时间:2014-08-15 04:59:24

标签: r shiny

嗨,目前我有一个像这样的样本数据集

 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。

在真实数据集中,有比本示例更多的网站和部分,所以我正在寻找一种通用的方法来识别每个网站中的部分,而不是自己键入名称。

任何人都可以帮我修改一下这段代码吗?

提前致谢

1 个答案:

答案 0 :(得分:10)

您应该查看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以与dfui.R共享server.R对象。

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_part更改时,使用观察者更新select_site选项。

server.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中:{{1 }}。 (请注意,您在此使用condition="input.select_site == 'A1'"而不是.,因为此条件是在您的浏览器中通过Javascript评估的,而不是由R的Shiny评估。)

然后,一旦用户切换到其他网站,$中的这些元素就会消失。 (更有趣的是,隐藏的输出元素即使其相关输入发生变化也不会更新。因为更新对用户不可见的内容毫无意义。)