You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过过滤后的响应式数据框值更新selectizeInput?

问题原因

  • 你更新参数下拉菜单的筛选逻辑存在错误:你需要的是选中日期下所有存在的检测参数,但原有代码里额外加了master$determinand==input$select的筛选条件,等于仅保留当前已经选中的参数,自然会出现下拉选项为空的问题。
  • 原有代码没有做好响应式依赖校验,容易触发无活跃响应式上下文的报错。

修复方案

仅需要替换原有代码的server部分即可:

server <- function(input, output, session) {
  
  # 1. 先筛选指定日期下所有可用的检测数据
  date_filtered <- reactive({
    req(input$date)
    master[master$date == input$date]
  })
  
  # 2. 日期变化时,更新可用的参数下拉列表,取当前日期下所有唯一的检测项
  observeEvent(date_filtered(), {
    possible_determinands <- sort(unique(date_filtered()$determinand))
    # 保留原有选中值(如果新日期下仍存在),否则默认选第一个可用值
    default_selected <- if (is.null(input$select) || !input$select %in% possible_determinands) {
      possible_determinands[1]
    } else {
      input$select
    }
    updateSelectizeInput(session, "select", choices = possible_determinands, selected = default_selected, server = TRUE)
  })
  
  # 3. 最终过滤数据:同时匹配日期和选中的参数
  data <- reactive({
    req(input$select, date_filtered())
    date_filtered()[date_filtered()$determinand == input$select]
  })
  
  points <- reactive({nrow(data())})
  
  output$points <- renderText({paste(points(), "sites available out of", length(unique(master$label)))})
  
  output$mymap <- renderLeaflet({
    
    # Check if dataframe is empty
    if(points()>0){
    
      binpal <- colorBin("RdBu", data()$value, n=5, pretty=TRUE) 
      radius=200*data()$value
      leaflet() %>%
      addTiles() %>%
      addRectangles(
        lng1=1.5, lat1=51.3,
        lng2=-1.5, lat2=53.3,
        fillColor = "transparent",
        color="#000000",
        weight=2,
        opacity=1
        ) %>%
      addCircles(lng=data()$long,lat=data()$lat, radius=radius, color=binpal(data()$value), label=data()$label, opacity=1, fillOpacity=0.5) %>%
      addLegend("bottomright", pal=binpal, values=data()$value, opacity=1)
    } 
    
    else {
      
      radius=100
      leaflet() %>%
      addTiles() %>%
      addRectangles(
        lng1=1.5, lat1=51.3,
        lng2=-1.5, lat2=53.3,
        fillColor = "transparent",
        color="#000000",
        weight=2,
        opacity=1
      ) %>%
        addCircles(lng=master$long,lat=master$lat, radius=radius, color="#000000", label=master$label, opacity=1, fillOpacity=0.5) 
    }
    
  })
}

修复说明

  • 拆分了日期过滤和参数过滤的逻辑,避免重复计算,结构更清晰
  • 所有响应式都加了req()校验,确保依赖值存在才执行,不会再触发无响应式上下文的报错
  • 增加了选中值兼容逻辑:如果原有选中的参数在新日期下依然可用,就保留选中状态,否则默认选中第一个可用参数,避免选中值失效

内容的提问来源于stack exchange,提问作者Zizzipupp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 17:45:06