嗨,目前我有一个像这样的样本数据集
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。
在真实数据集中,有比本示例更多的网站和部分,所以我正在寻找一种通用的方法来识别每个网站中的部分,而不是自己键入名称。
任何人都可以帮我修改一下这段代码吗?
提前致谢
答案 0 :(得分:10)
您应该查看updateSelectInput
而不是conditionalPanel
。
conditionalPanel
做的是隐藏某些UI元素,而不是隐藏selectInput
中的某些选项。
在您的情况下,您可以在server.R
中创建观察者,以监视用户对select_site
所做的选择。
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
以与df
和ui.R
共享server.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
选项。
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评估。)
然后,一旦用户切换到其他网站,$
中的这些元素就会消失。 (更有趣的是,隐藏的输出元素即使其相关输入发生变化也不会更新。因为更新对用户不可见的内容毫无意义。)