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

Shiny中Vtree的动态调整:如何取消选择及多选设置

Vtree Shiny 应用优化方案

1. 禁用特定层级(以Level2为例)

要禁用Level2选择框,有两种实用方式:

方式一:固定禁用(UI层直接设置)

使用Shiny内置的disabled()函数(需Shiny版本≥1.6.0),直接包裹目标选择框,页面加载后Level2将处于禁用状态:

disabled(selectizeInput("level2", label = "Level2", choices = NULL))

若你的Shiny版本较低,可引入shinyjs包实现:

  • 在UI开头添加useShinyjs()
  • 在server中调用disable("level2")触发禁用

方式二:动态控制禁用状态

如果需要根据条件动态切换禁用/启用,可通过observe配合updateSelectizeInput的disabled参数:

observe({
  # 可自定义判断条件,比如当Level1选中特定值时禁用Level2
  updateSelectizeInput(session, "level2", choices = colnames(df()[vector]), disabled = TRUE)
})

2. 让Values支持多选与全选

要实现多选和全选功能,需修改选择框配置并在server端处理选中值:

步骤1:修改UI中的Values选择框

添加multiple = TRUE开启多选:

selectizeInput("values", label= "Values", choices = NULL, multiple = TRUE)

步骤2:Server端处理全选逻辑

更新选项时加入"全选",并在渲染Vtree时判断选中状态,返回对应值:

# 更新Values选项时添加全选
updateSelectizeInput(session, "values", choices = c("全选", unique(df()$cyl)))

# 处理选中值逻辑
selected_values <- reactive({
  if (is.null(input$values)) return(NULL)
  if ("全选" %in% input$values) {
    unique(df()$cyl)
  } else {
    input$values
  }
})

# 渲染Vtree时使用处理后的值
output[["VTREE"]] <- renderVtree({
  vtree(df(), c(input$level1, input$level2, input$level3, input$level4),
        sameline = TRUE,
        follow=list(cyl=selected_values()),
        pngknit=FALSE,
        horiz=TRUE,height=450,width=850)
})

完整修改后代码

library(shiny)
library(vtree)

# Define UI ----
ui <- pageWithSidebar(
  
  # App title ----
  headerPanel("Cyl vtree"),
  
  # Sidebar panel for inputs ----
  sidebarPanel(
    selectizeInput("level1", label = "Level1", choices = NULL, selected = NULL),
    # 固定禁用Level2
    disabled(selectizeInput("level2", label = "Level2", choices = NULL)),
    selectizeInput("level3", label = "Level3", choices = NULL),
    selectizeInput("level4", label = "Level4", choices = NULL),
    # 开启多选功能
    selectizeInput("values", label= "Values", choices = NULL, multiple = TRUE),
  ),
  
  # Main panel for displaying outputs ----
  mainPanel(
    vtreeOutput("VTREE")
    
  )
)

# Define server logic to plot ----
server <- function(input, output,session) {
  df <- reactiveVal(mtcars)
  vector <- c("cyl","vs", "am","gear")
  
  observe({
    updateSelectizeInput(session, "level1", choices = colnames(df()[vector]), selected = NULL) 
    # 若需动态禁用Level2,可取消注释该行(与UI层禁用二选一)
    # updateSelectizeInput(session, "level2", selected = NULL, choices = colnames(df()[vector]), disabled = TRUE)
    updateSelectizeInput(session, "level3", choices = colnames(df()[vector])) 
    updateSelectizeInput(session, "level4", choices = colnames(df()[vector])) 
    # 添加全选选项
    updateSelectizeInput(session, "values", choices = c("全选", unique(df()$cyl)))
  })
  
  # 处理全选逻辑,增加空值判断避免报错
  selected_values <- reactive({
    if (is.null(input$values)) {
      return(NULL)
    }
    if ("全选" %in% input$values) {
      unique(df()$cyl)
    } else {
      input$values
    }
  })
  
  output[["VTREE"]] <- renderVtree({
    # 过滤空层级,避免传入无效参数
    levels <- c(input$level1, input$level2, input$level3, input$level4)
    levels <- levels[!is.na(levels) & levels != ""]
    
    vtree(df(), levels,
          sameline = TRUE,
          follow=list(cyl=selected_values()),
          pngknit=FALSE,
          horiz=TRUE,height=450,width=850)
  })

}

shinyApp(ui, server)

额外优化说明

  • 加入层级过滤逻辑:自动剔除未选择的空层级,避免Vtree接收无效参数
  • 增加selected_values的空值判断,防止应用初始状态下报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:05:19