R闪亮-选择城市取决于通过selectInput

时间:2019-04-04 07:49:44

标签: r shiny selectinput

我正在尝试基于“省”列和“城市”列对数据框进行子集化。令人眼前一亮的是,我想让用户使用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")
    )
  )

))

1 个答案:

答案 0 :(得分:0)

代码

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。 / li>
  • 我在这里使用基数R进行子集设置,但是如果需要,可以很容易地用tidyverse语法代替它。
  • 我在过滤中使用了%in%而不是==,以便允许在多面图中扩展显示多个城市/省份
相关问题