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

Shiny中如何为shinydashboard头部switchInput添加进度提示组件

解决方案

实现思路

shinyWidgets提供的progressBar默认样式是为页面主体区域设计的,无法适配dashboardHeader导航栏的窄高布局,因此我们自定义轻量进度条嵌入头部leftUi区域,配合shinyjs控制显示、进度更新和隐藏,完全适配头部布局。

完整可运行代码

library(shiny)
library(shinydashboard)
library(shinydashboardPlus)
library(shinyWidgets)
library(shinyjs)

ui <- dashboardPage(skin = 'blue', 
  # 启用shinyjs用于DOM操作
  useShinyjs(),
  shinydashboardPlus::dashboardHeader(title = 'Example',
    leftUi = tagList(
      switchInput(inputId = 'swtLabels', label = 'Labels', value = TRUE,
                  onLabel = 'Label 1', offLabel = 'Label 2',
                  onStatus = 'info', offStatus = 'info', size = 'mini', 
                  handleWidth = 230),
      # 自定义头部进度条,默认隐藏,适配导航栏高度和主题配色
      div(id = "progress_container", 
          style = "display: inline-block; vertical-align: middle; margin-left: 15px; width: 160px;",
          div(style = "color: #fff; font-size: 12px; margin-bottom: 2px;", id = "progress_text", "处理中..."),
          div(style = "width: 100%; height: 8px; background-color: rgba(255,255,255,0.2); border-radius: 4px; overflow: hidden;",
              div(id = "progress_bar", style = "height: 100%; width: 0%; background-color: #3c8dbc; transition: width 0.3s ease;")
          )
      ) %>% hidden() # 初始状态隐藏
    )
  ),
  dashboardSidebar(),
  dashboardBody()
)

server <- function(input, output, session) {
  # 监听switch切换事件
  observeEvent(input$swtLabels, {
    # 切换时先显示进度条
    show("progress_container")
    # 步骤1:替换为你的实际业务逻辑
    Sys.sleep(5) 
    runjs("$('#progress_bar').css('width', '25%'); $('#progress_text').text('步骤1完成');")
    # 步骤2:替换为你的实际业务逻辑
    Sys.sleep(5) 
    runjs("$('#progress_bar').css('width', '50%'); $('#progress_text').text('步骤2完成');")
    # 步骤3:替换为你的实际业务逻辑
    Sys.sleep(5) 
    runjs("$('#progress_bar').css('width', '75%'); $('#progress_text').text('步骤3完成');")
    # 步骤4:替换为你的实际业务逻辑
    Sys.sleep(5) 
    runjs("$('#progress_bar').css('width', '100%'); $('#progress_text').text('处理完成');")
    # 展示完成状态0.5秒后隐藏进度条
    Sys.sleep(0.5)
    hide("progress_container")
    # 重置进度条状态,方便下次触发
    runjs("$('#progress_bar').css('width', '0%'); $('#progress_text').text('处理中...');")
  })
}

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

关键说明

  • 自定义进度条样式完全适配dashboardHeader的高度和主题配色,不会出现布局溢出、样式错乱问题
  • 可根据实际任务步骤数调整进度百分比和提示文字,用户能实时感知任务执行进度
  • 任务完成后自动隐藏进度条,不会占用头部导航栏的可用空间
  • 如果不需要文字提示,直接删掉progress_text对应的div即可,只保留进度条部分

内容的提问来源于stack exchange,提问作者KirkD-CO

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:06:03