根据第一次选择观察updateSelectInput

时间:2013-11-19 14:19:03

标签: r select input shiny

我的server.R有以下代码,我希望我的Shiny应用程序根据Country Selection选择状态,但它显示第二行中的所有状态。我想在这里,observe只是观察不执行任何操作。

  shinyServer(function(input, output, session) {

      observe({
          ddf = df[df$Date>=input$daterange[1] & df$Date<=input$daterange[2],]
          updateSelectInput(session, "Country", choices = ddf$Country)
          ddf1 = subset(ddf, grepl(input$Country, ddf$State))
          updateSelectInput(session, "State", choices =  ddf1$State)  
            })

    }

基于以上选择,我想传递一些数据框用于绘图。当我选择不同的国家时,它会更改状态列表一秒钟并返回所有第一个国家/地区的州列表。如果有人能在这里展示一个例子,我真的很感激。 我的ui.R代码在

之下
 sidebarPanel(
    wellPanel(dateRangeInput("daterange", "Date range:",
                      Sys.Date()-10,
                      Sys.Date()+10)),
    wellPanel(selectInput("Country", "Select a Country:",
                          '')),
    wellPanel(selectInput("State", "Select a State:",
                          '')))

1 个答案:

答案 0 :(得分:4)

我认为观察者之间存在冲突,因为它包含input$Country以及Country输入的更新程序。然后我会尝试将它分成两个观察者,我只使用一个反应导体使ddf只有一次。

get_ddf <- reactive({
  df[df$Date>=input$daterange[1] & df$Date<=input$daterange[2],]
})
observe({
  updateSelectInput(session, "Country", choices = get_ddf()$Country)
})
observe({
  ddf1 = subset(get_ddf(), grepl(input$Country, get_ddf()$State))
  updateSelectInput(session, "State", choices =  ddf1$State)  
})

此外,你不应该在choices参数中使用列的级别而不是列本身吗?

observe({
  updateSelectInput(session, "Country", choices = levels(droplevels(get_ddf()$Country)))
})
observe({
  ddf1 = droplevels(subset(get_ddf(), grepl(input$Country, get_ddf()$State)))
  updateSelectInput(session, "State", choices =  levels(ddf1$State))  
})

如果CountryState列不是因素而是字符,请使用unique()代替levels(droplevels())