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

Shiny中重置MultiInput时未清除左侧可选选项的问题

Shiny中multiInput重置后未选选项未清空的解决方法

你的问题核心在于:shinyjs::reset()仅会将组件恢复到初始渲染状态,而multiInput在选择数据集后已经更新了choices列表,重置操作只能清空选中项,无法修改已更新的choices,导致左侧未选选项残留之前的变量。

修改后的完整代码

library(shiny)
library(shinyWidgets)
library(shinyjs)
library(purrr)

dfs <- keep(ls("package:datasets"), ~ is.data.frame(get(.x, "package:datasets")))

ui <- fluidPage(
  shinyjs::useShinyjs(),
  selectizeInput("dataset", "Select Dataset", choices = dfs, selected = NULL, multiple = TRUE, options = list(maxItems = 1)),
  multiInput("varselect", "Select Variables", choices = c("")),
  actionButton("reset_variables", "Reset Vars", style = "width: 145px; height: 40px")
)

server <- function(input, output, session) {

  data <- reactive({
    req(input$dataset)
    get(input$dataset, "package:datasets")
  })
  
  vars <- reactive(names(data()))
  
  observeEvent(input$dataset, {
    updateMultiInput(session, "varselect", choices = vars())
  })

  # 修改重置逻辑:主动重置multiInput的选项和选中状态
  observeEvent(input$reset_variables, {
    shinyjs::reset("dataset")
    # 重置multiInput为初始状态:空选项+无选中项
    updateMultiInput(session, "varselect", choices = c(""), selected = character(0))
  })
  
}

shinyApp(ui, server)

关键修改说明

  1. 点击重置按钮时,先通过shinyjs::reset("dataset")清空数据集选择框。
  2. 主动调用updateMultiInput(),将varselect的choices重置为初始的c(""),同时设置selected = character(0)确保选中区域也被清空。
  3. 避免依赖input$dataset的变化触发multiInput更新(因为dataset重置后input$dataset为NULL,vars()会因req(input$dataset)无法执行),直接在重置逻辑中完成multiInput的状态恢复。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 22:52:39