更新闪亮的UI元素并不会使其关联的输入值无效

时间:2018-03-21 23:19:45

标签: shiny r-markdown reactive-programming

我正在使用带有R_Markdown和Shiny的交互式文档方法开发一个简单的Web应用程序。我有一系列输入UI对象来获取用户选项,每个对象都修改链中的下一个,最后一个触发输出(图表)。所以我有

  1. 地图,点击时定义
  2. 可用数据的季节,当选择一个时,它会给出
  3. 数据中的土壤类型,当选择一个或多个时,它会给出
  4. 数据中的高程类,当选择一个时,我们然后计算并绘制
  5. 所选数据的输出图表。
  6. 因此,例如,有下拉列表来选择季节和土壤:

      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选项和选择更改时或用户进行不同选择时触发。感谢。

1 个答案:

答案 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")