R Shiny - Select 城市取决于使用 selectInput 选择的省份
R Shiny - Select City depend on selected Province with selectInput
我正在尝试根据 Province 列和 City 列对数据框进行子集化。在 shiny 中,我想让用户选择省份然后选择城市,使用 selectInput UI.
这是数据框的样子。
列InfoTemp[2]
是城市,InfoTemp[3]
是省
数据集很大,它们实际上有很多层次。
Year Autumn InfoTemp[2] InfoTemp[3]
1913 8.9 SHAWNIGAN LAKE BC
1914 9.5 SHAWNIGAN LAKE BC
1915 9.3 SHAWNIGAN LAKE BC
1916 8.5 SHAWNIGAN LAKE BC
1917 9.9 SHAWNIGAN LAKE BC
1918 -9999.9 SHAWNIGAN LAKE BC
最终,这是我打算去的地块(城市)。
这是目前为止的代码,没有做任何事情...
server.R
library(shiny)
shinyServer(function(input, output) {
#MeanTemp
load("CanadianMeanTemp.Rdata")
province = input$provinces
city = input$cities
output$distPlot <- renderPlot({
MeanTemp_province = MeanTemp[grep(c(province), MeanTemp$`InfoTemp[3]`),]
MeanTemp_city = MeanTemp_province[grep(c(city), MeanTemp$`InfoTemp[2]`),]
plot(MeanTemp_city$Year, MeanTemp_city$Annual, type = "l")
lines(supsmu(MeanTemp_city$Year, MeanTemp_city$Annual), col = 2)
})
})
ui.R
library(shiny)
shinyUI(fluidPage(
titlePanel("Temperature"),
sidebarLayout(
sidebarPanel(
selectInput('provinces', 'Province', choices = levels(MeanTemp$`InfoTemp[3]`)),
conditionalPanel(
condition = "input.provinces == true",
selectInput('cities', 'City', choices = levels(MeanTemp_province$`InfoTemp[2]`))
)
),
mainPanel(
plotOutput("distPlot")
)
)
))
代码
library(shiny)
city_data <- expand.grid(Year = seq.Date(as.Date("1990/1/1"),
as.Date("2000/1/1"), by = "year"),
Province = LETTERS[1:3],
City_Counter = 1:4)
city_data$City <- paste(city_data$Province, city_data$City_Counter, sep = "_")
city_data$Autumn <- runif(NROW(city_data), 10, 100)
ui <- fluidPage(
selectInput("province", "Select province:", unique(city_data$Province)),
selectInput("city", "Select city:", unique(city_data$City)),
plotOutput("plot")
)
server <- function(input, output, session) {
get_filtered_data <- reactive({
city_data[city_data$Province %in% input$province &
city_data$City %in% input$city, , drop = FALSE]
})
observe({
updateSelectInput(session,
"city",
choices = unique(city_data[city_data$Province %in%
input$province, "City"]))
})
output$plot <- renderPlot({
my_data <- get_filtered_data()
req(NROW(my_data) > 0)
plot(my_data$Year, my_data$Autumn, type = "l")
})
}
shinyApp(ui, server)
一些备注
- 我使用
updateSelectInput
而不是 uiOutput
方法,b/c 我觉得在最后只有 choices
变化。
- 我在这里使用基础 R 进行子集化,但如果需要,这可以很容易地用
tidyverse
语法替换
- 我在过滤中使用
%in%
而不是 ==
,以便在需要时允许扩展它以在多面图中显示多个城市/省份
我正在尝试根据 Province 列和 City 列对数据框进行子集化。在 shiny 中,我想让用户选择省份然后选择城市,使用 selectInput UI.
这是数据框的样子。
列InfoTemp[2]
是城市,InfoTemp[3]
是省
数据集很大,它们实际上有很多层次。
Year Autumn InfoTemp[2] InfoTemp[3] 1913 8.9 SHAWNIGAN LAKE BC 1914 9.5 SHAWNIGAN LAKE BC 1915 9.3 SHAWNIGAN LAKE BC 1916 8.5 SHAWNIGAN LAKE BC 1917 9.9 SHAWNIGAN LAKE BC 1918 -9999.9 SHAWNIGAN LAKE BC
最终,这是我打算去的地块(城市)。
这是目前为止的代码,没有做任何事情...
server.R
library(shiny)
shinyServer(function(input, output) {
#MeanTemp
load("CanadianMeanTemp.Rdata")
province = input$provinces
city = input$cities
output$distPlot <- renderPlot({
MeanTemp_province = MeanTemp[grep(c(province), MeanTemp$`InfoTemp[3]`),]
MeanTemp_city = MeanTemp_province[grep(c(city), MeanTemp$`InfoTemp[2]`),]
plot(MeanTemp_city$Year, MeanTemp_city$Annual, type = "l")
lines(supsmu(MeanTemp_city$Year, MeanTemp_city$Annual), col = 2)
})
})
ui.R
library(shiny)
shinyUI(fluidPage(
titlePanel("Temperature"),
sidebarLayout(
sidebarPanel(
selectInput('provinces', 'Province', choices = levels(MeanTemp$`InfoTemp[3]`)),
conditionalPanel(
condition = "input.provinces == true",
selectInput('cities', 'City', choices = levels(MeanTemp_province$`InfoTemp[2]`))
)
),
mainPanel(
plotOutput("distPlot")
)
)
))
代码
library(shiny)
city_data <- expand.grid(Year = seq.Date(as.Date("1990/1/1"),
as.Date("2000/1/1"), by = "year"),
Province = LETTERS[1:3],
City_Counter = 1:4)
city_data$City <- paste(city_data$Province, city_data$City_Counter, sep = "_")
city_data$Autumn <- runif(NROW(city_data), 10, 100)
ui <- fluidPage(
selectInput("province", "Select province:", unique(city_data$Province)),
selectInput("city", "Select city:", unique(city_data$City)),
plotOutput("plot")
)
server <- function(input, output, session) {
get_filtered_data <- reactive({
city_data[city_data$Province %in% input$province &
city_data$City %in% input$city, , drop = FALSE]
})
observe({
updateSelectInput(session,
"city",
choices = unique(city_data[city_data$Province %in%
input$province, "City"]))
})
output$plot <- renderPlot({
my_data <- get_filtered_data()
req(NROW(my_data) > 0)
plot(my_data$Year, my_data$Autumn, type = "l")
})
}
shinyApp(ui, server)
一些备注
- 我使用
updateSelectInput
而不是uiOutput
方法,b/c 我觉得在最后只有choices
变化。 - 我在这里使用基础 R 进行子集化,但如果需要,这可以很容易地用
tidyverse
语法替换 - 我在过滤中使用
%in%
而不是==
,以便在需要时允许扩展它以在多面图中显示多个城市/省份