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

shinywidgets中pickerInput的「None」选项无法清空表格问题

解决Shiny应用中pickerInput选「None」时表格不更新的问题

问题原因

  1. filtered_data_full仅监听数值和日期输入,未关联input$namePicker,导致选择「None」时不会触发重新计算,表格保留之前的过滤结果。
  2. 当无名称选中时,filtered_data()返回空表,此时调用min()/max()会生成无效值,导致动态输入控件渲染失败,后续过滤逻辑无法正常触发。

修复方案

  • 让filtered_data_full同时监听input$namePicker,确保名称选择变化时触发重新过滤。
  • 在动态输入控件生成逻辑中加入验证,避免空数据集导致的错误。
  • 在filtered_data_full中先判断数据集是否为空,为空则直接返回空表。

修改后的完整代码

library(shiny)
library(shinydashboard)
library(shinyWidgets)
library(DT)

# 创建示例数据
set.seed(123)
dates <- seq(as.Date("2023-01-01"), as.Date("2023-12-31"), by = "days")
numeric_values <- sample(1:100, length(dates), replace = TRUE)
names <- rep(c("Alice", "Bob", "Charlie"), length.out = length(dates))

df <- data.frame(Date = dates, Numeric = numeric_values, Name = names)

# UI定义
ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      pickerInput("namePicker", "Select Name:", choices = unique(df$Name), selected = unique(df$Name)[1], multiple = TRUE,
                  options = list(
                    `actions-box` = TRUE,
                    `deselect-all-text` = "None...",
                    `select-all-text` = "Yeah, all !",
                    `none-selected-text` = "zero"
                  )),
      uiOutput("inputs")
    ),
    mainPanel(
      DTOutput("table")
    )
  )
)

# Server逻辑
server <- function(input, output, session) {
  # 根据选中名称过滤数据
  filtered_data <- eventReactive(input$namePicker, {
    if (length(input$namePicker) == 0) {
      return(df[0, ]) # 无选中时返回空表
    }
    df[df$Name %in% input$namePicker, ]
  })
  
  # 动态生成输入控件(加入空数据验证)
  output$inputs <- renderUI({
    req(filtered_data()) # 数据为空时不渲染输入控件
    tagList(
      numericInput(
        "minNumeric",
        "Min Numeric Value:",
        value = min(filtered_data()$Numeric),
        min = min(filtered_data()$Numeric),
        max = max(filtered_data()$Numeric)
      ),
      numericInput(
        "maxNumeric",
        "Max Numeric Value:",
        value = max(filtered_data()$Numeric),
        min = min(filtered_data()$Numeric),
        max = max(filtered_data()$Numeric)
      ),
      dateInput(
        "minDate",
        "Min Date:",
        min = min(filtered_data()$Date),
        max = max(filtered_data()$Date),
        value = min(filtered_data()$Date)
      ),
      dateInput(
        "maxDate",
        "Max Date:",
        min = min(filtered_data()$Date),
        max = max(filtered_data()$Date),
        value = max(filtered_data()$Date)
      )
    )
  })
  
  # 完整过滤逻辑(新增input$namePicker监听)
  filtered_data_full <- eventReactive(
    list(input$namePicker, input$minNumeric, input$maxNumeric, input$minDate, input$maxDate),
    {
      if (nrow(filtered_data()) == 0) {
        return(filtered_data()) # 数据为空直接返回
      }
      validate(need(input$minDate <= input$maxDate, "min Date has to be smaller or equal than max Date"))
      validate(need(input$minNumeric <= input$maxNumeric, "min Numeric has to be smaller or equal than max Numeric"))
      subset(filtered_data(), Numeric >= input$minNumeric & Numeric <= input$maxNumeric & Date >= input$minDate & Date <= input$maxDate)
    },
    ignoreInit = TRUE
  )
  
  observe({
    if (NROW(filtered_data_full())) {
      updateNumericInput(
        session,
        "maxNumeric",
        "Max Numeric Value:",
        value = max(filtered_data_full()$Numeric),
        min = min(filtered_data_full()$Numeric),
        max = max(filtered_data_full()$Numeric)
      )
      updateNumericInput(
        session,
        "minNumeric",
        "Min Numeric Value:",
        min = min(filtered_data_full()$Numeric),
        max = max(filtered_data_full()$Numeric),
        value = min(filtered_data_full()$Numeric)
      )
      updateDateInput(
        session,
        "minDate",
        "Min Date:",
        min = min(filtered_data_full()$Date),
        max = max(filtered_data_full()$Date),
        value = min(filtered_data_full()$Date)
      )
      updateDateInput(
        session,
        "maxDate",
        "Max Date:",
        min = min(filtered_data_full()$Date),
        max = max(filtered_data_full()$Date),
        value = max(filtered_data_full()$Date)
      )
    }
  })
  
  output$table <- renderDT({
    datatable(filtered_data_full(), options = list(pageLength = 10))
  })
}

# 运行应用
shinyApp(ui = ui, server = server)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 04:57:24