我的 server.R 有以下代码,我希望我的 Shiny 应用程序根据国家选择选择国家,但它在第二行显示所有状态。我猜在这里,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:",
'')))
最佳答案
我认为您的观察者中存在冲突,因为它包含 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())
.
关于r - 根据第一次选择观察 updateSelectInput,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20073948/