我的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:",
'')))
答案 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))
})
如果Country
和State
列不是因素而是字符,请使用unique()
代替levels(droplevels())
。