我正在使用带有R_Markdown和Shiny的交互式文档方法开发一个简单的Web应用程序。我有一系列输入UI对象来获取用户选项,每个对象都修改链中的下一个,最后一个触发输出(图表)。所以我有
因此,例如,有下拉列表来选择季节和土壤:
output$season_selector <- renderUI({
cat(file=stderr(), paste("render season selector"), "\n")
selectInput("season", h4("Season?"), my$season_here, selected=my$season_sel)
})
output$soil_selector <- renderUI({
cat(file=stderr(), paste("render soil selector"), "\n")
selectInput("soil", h4("Soils?"), my$soil_here, selected=my$soil_sel,
selectize=FALSE, multiple=TRUE)
})
我观察输入$ season,这会触发&#34;土壤&#34; UI元素。
observeEvent(input$season, {
...
# reset soil list and default soil selected
my$soil_sel <- my$soil_here
updateSelectInput(session, "soil", choices=my$soil_here, selected=my$soil_sel)
})
然而,这确实使输入$ soil无效(尽管UI元素选项和选择已经改变,用户没有做出选择),因此级联中的下一步不会触发:
observeEvent(input$soil, {
...
# reset elev list and default elev selected
my$soil_sel <- my$soil_here
updateSelectInput(session, "soil", choices=my$soil_here, selected=my$soil_sel)
})
如何实现像这样的级联反应式UI元素?每个反应都需要在UI选项和选择更改时或用户进行不同选择时触发。感谢。
答案 0 :(得分:0)
好的,我想我已修好了。我需要使用以下模式,它会在链中进一步重置变量,并且除非值已更改,否则不会响应用户输入。这可以避免重复或丢失事件。
# reset selections
my$soil_default <- my$soil_here
my$soil <- my$soil_default
my$elev <- list(NA)
}) # end reaction to season changing
observeEvent(input$soil, {
req(input$soil, input$soil!="NA")
if (any(my$soil != input$soil)) {
my$soil <- input$soil
my$elev <- list(NA)
}
})
#### react to change of soil ####
observeEvent(my$soil, {
cat(file=stderr(), "\n")
cat(file=stderr(), paste("change of my$soil = "))
cat(file=stderr(), paste(my$soil), "\n")
req(my$soil, my$soil!="NA")