如何创建动态 ui Rshiny
How to create a dynamic ui Rshiny
我是 Rshiny 的新手,现在我尝试设计一个动态的 ui Rshiny。附上我的 ui.R 和 server.R。它用完了一个错误。这是不同年份风暴的数据集。
ui.R
library(shiny)
library(hurricaneexposure)
library(hurricaneexposuredata)
data("hurr_tracks")
storms <- unique(hurr_tracks$storm_id)
storm_years <- as.numeric(gsub(".+-", "", storms))
storms <- storms[storm_years <= 2011]
years <- unique(storm_years)
years <- years[years<=2011]
## Split storm_id based on same year
stm <- split(storms, gsub(".+-", "", storms))
shinyUI(fluidPage(
# Application title
titlePanel("Hurricane"),
sidebarLayout(
sidebarPanel(
selectInput("years",label = "years",years),
# This outputs the dynamic UI component
uiOutput("ui")
),
mainPanel()
)
))
和
server.R
shinyServer(function(input, output) {
output$ui <- renderUI({
switch (input$years,
"1988"=selectInput("storm_id",label="storm_id",stm$`1988`)
)
})
如您在 ui 部分所见。我创建变量 "years" 和 "stm"。 "years"包括从1988年到2011年的所有年份。"stm"是一个拆分数据集,它是根据年份拆分风暴。
> head(stm)
$`1988`
[1] "Alberto-1988" "Beryl-1988" "Chris-1988" "Florence-1988" "Gilbert-1988" "Keith-1988"
$`1989`
[1] "Allison-1989" "Chantal-1989" "Hugo-1989" "Jerry-1989"
我的目标是创建两个 "selectInput",它们的名字是 "years" 和 "storms"。
在selectinput for years中,我可以select年从1988年到2011年,例如,如果我select 1989年,那么第二个selectinput将只显示storms in 1989 年
"Allison-1989" "Chantal-1989" "Hugo-1989" "Jerry-1989"
有什么好的建议吗?
您应该查看 updateSelectInput
,该函数可让您更改已在 ui 端呈现的 selectInputs
。
查看 this page 了解更多详情。
有了这个,您可以为风暴设置一个代理 selectInput
,每当输入的年份发生变化时,您都可以将 selectInput
的选择更改为正确的选择。
抱歉,我无法测试我的解决方案,因为我没有您的数据集。但是尝试这个想法并评论并询问,如果这不适合你。
library(shiny)
library(hurricaneexposure)
library(hurricaneexposuredata)
data("hurr_tracks")
storms <- unique(hurr_tracks$storm_id)
storm_years <- as.numeric(gsub(".+-", "", storms))
storms <- storms[storm_years <= 2011]
years <- unique(storm_years)
years <- years[years<=2011]
## Split storm_id based on same year
stm <- split(storms, gsub(".+-", "", storms))
ui <- shinyUI(fluidPage(
# Application title
titlePanel("Hurricane"),
sidebarLayout(
sidebarPanel(
selectInput("years", label = "years", years),
selectInput("storm_id", label = "Storms", choices = NULL)
),
mainPanel()
)
))
server <- function(input, output, session) {
observeEvent(input$years, {
updateSelectInput(session, "storm_id", choices = stm[[input$years]])
})
}
shinyApp(ui, server)
我是 Rshiny 的新手,现在我尝试设计一个动态的 ui Rshiny。附上我的 ui.R 和 server.R。它用完了一个错误。这是不同年份风暴的数据集。
ui.R
library(shiny)
library(hurricaneexposure)
library(hurricaneexposuredata)
data("hurr_tracks")
storms <- unique(hurr_tracks$storm_id)
storm_years <- as.numeric(gsub(".+-", "", storms))
storms <- storms[storm_years <= 2011]
years <- unique(storm_years)
years <- years[years<=2011]
## Split storm_id based on same year
stm <- split(storms, gsub(".+-", "", storms))
shinyUI(fluidPage(
# Application title
titlePanel("Hurricane"),
sidebarLayout(
sidebarPanel(
selectInput("years",label = "years",years),
# This outputs the dynamic UI component
uiOutput("ui")
),
mainPanel()
)
))
和
server.R
shinyServer(function(input, output) {
output$ui <- renderUI({
switch (input$years,
"1988"=selectInput("storm_id",label="storm_id",stm$`1988`)
)
})
如您在 ui 部分所见。我创建变量 "years" 和 "stm"。 "years"包括从1988年到2011年的所有年份。"stm"是一个拆分数据集,它是根据年份拆分风暴。
> head(stm)
$`1988`
[1] "Alberto-1988" "Beryl-1988" "Chris-1988" "Florence-1988" "Gilbert-1988" "Keith-1988"
$`1989`
[1] "Allison-1989" "Chantal-1989" "Hugo-1989" "Jerry-1989"
我的目标是创建两个 "selectInput",它们的名字是 "years" 和 "storms"。 在selectinput for years中,我可以select年从1988年到2011年,例如,如果我select 1989年,那么第二个selectinput将只显示storms in 1989 年
"Allison-1989" "Chantal-1989" "Hugo-1989" "Jerry-1989"
有什么好的建议吗?
您应该查看 updateSelectInput
,该函数可让您更改已在 ui 端呈现的 selectInputs
。
查看 this page 了解更多详情。
有了这个,您可以为风暴设置一个代理 selectInput
,每当输入的年份发生变化时,您都可以将 selectInput
的选择更改为正确的选择。
抱歉,我无法测试我的解决方案,因为我没有您的数据集。但是尝试这个想法并评论并询问,如果这不适合你。
library(shiny)
library(hurricaneexposure)
library(hurricaneexposuredata)
data("hurr_tracks")
storms <- unique(hurr_tracks$storm_id)
storm_years <- as.numeric(gsub(".+-", "", storms))
storms <- storms[storm_years <= 2011]
years <- unique(storm_years)
years <- years[years<=2011]
## Split storm_id based on same year
stm <- split(storms, gsub(".+-", "", storms))
ui <- shinyUI(fluidPage(
# Application title
titlePanel("Hurricane"),
sidebarLayout(
sidebarPanel(
selectInput("years", label = "years", years),
selectInput("storm_id", label = "Storms", choices = NULL)
),
mainPanel()
)
))
server <- function(input, output, session) {
observeEvent(input$years, {
updateSelectInput(session, "storm_id", choices = stm[[input$years]])
})
}
shinyApp(ui, server)