如何使用闪亮的条件面板

Lam*_*mbo 5 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
Run Code Online (Sandbox Code Playgroud)

我想在两个选择框的闪亮用户界面中放置一个侧栏.一个是"选择"网站,另一个是"部分".

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

)
)
)
Run Code Online (Sandbox Code Playgroud)

目标是当我在"select_site"中选择A1时,我只能在"select_part"中选择a1或a2.但是,无论我如何在"select_site"中选择,此代码现在可以在"select_part"中选择a1,a2,b1,b2,b3,c1,c2.

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

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

提前致谢

Xin*_*Yin 10

你应该看一下updateSelectInput而不是conditionalPanel.什么conditionalPanel是完全隐藏一些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")  
      )

    )
  )
)
Run Code Online (Sandbox Code Playgroud)

现在创建一个global.R共享df与两个对象ui.Rserver.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
Run Code Online (Sandbox Code Playgroud)

最后,在服务器端,使用观察者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)
    }
  })
})
Run Code Online (Sandbox Code Playgroud)

最后评论

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

然后,一旦用户切换到其他站点,该区域中的那些元素conditionalPanel就会消失.(更有趣的是,隐藏的输出元素即使其相关输入发生变化也不会更新.因为更新对用户不可见的内容没有意义.)