嗨,目前我有一个像这样的样本数据集
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.
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.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
Run Code Online (Sandbox Code Playgroud)
最后,在服务器端,使用观察者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)
}
})
})
Run Code Online (Sandbox Code Playgroud)
conditionalPanel如果您只想有条件地显示其他特定于站点的元素,则可以使用.例如,如果站点A1具有某些非常特定的输入控件或其他站点中不存在的输出元素,则可以condtionalPanel使用condition参数将这些输入/输出元素包装在a中:condition="input.select_site == 'A1'".(注意你.在这里使用而不是$因为这个条件是在你的浏览器中通过Javascript评估的,而不是由R的Shiny评估)
然后,一旦用户切换到其他站点,该区域中的那些元素conditionalPanel就会消失.(更有趣的是,隐藏的输出元素即使其相关输入发生变化也不会更新.因为更新对用户不可见的内容没有意义.)
| 归档时间: |
|
| 查看次数: |
8191 次 |
| 最近记录: |