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

调整Shiny中selectInput组件以显示对应工作日的正确班次

解决Shiny应用中根据工作日动态更新班次选项的问题

要实现根据选择的工作日动态显示对应班次选项的功能,我们可以通过动态更新selectInput结合数据框df1的配置来完成。核心思路是监听工作日选择的变化,从df1中筛选出对应工作日的所有班次并去重,然后更新班次选择框的选项。

修改后的完整代码

library(shiny)
library(shinythemes)
library(lubridate) # 用于处理日期提取星期几(可选)

df1 <- structure(
  list(
    Marketname = c("Market1","Market1", "Market2","Market2", "Market3", "Market3"),
    Days = c("Sunday","Sunday","Sunday","Sunday", "Sunday","Tuesday"),
    Openinghours = c("Morning","Evening", "Morning","Evening","Evening","Evening")
  ),row.names = c(NA, 6L), class = "data.frame")

ui <- fluidPage(
  shiny::navbarPage(theme = shinytheme("flatly"), collapsible = TRUE,
                    br(),
                    tabPanel("",
                             sidebarLayout(
                               sidebarPanel(
                                 # 直接选择星期几(贴合需求场景)
                                 selectInput("selected_day", label = h5("选择工作日"),
                                             choices = unique(df1$Days),
                                             selected = "Sunday"),
                                 # 动态生成班次选择框
                                 uiOutput("hours_ui")
                               ),
                               mainPanel()
                             ))
  ))

server <- function(input, output, session) {
  
  # 根据选择的工作日获取对应班次选项
  shift_choices <- reactive({
    req(input$selected_day)
    # 从df1筛选对应工作日的班次,去重后排序
    unique(df1$Openinghours[df1$Days == input$selected_day]) %>% sort()
  })
  
  # 动态渲染班次选择框
  output$hours_ui <- renderUI({
    selectInput("hours", label = h5("选择工作班次"),
                choices = shift_choices(),
                selected = shift_choices()[1])
  })
  
  # 若需基于日期范围提取星期几,可替换为以下逻辑(注释部分)
  # output$daterange <- renderUI({
  #   dateRangeInput("daterange1", "选择查看时段:")
  # })
  # selected_day <- reactive({
  #   req(input$daterange1)
  #   wday(input$daterange1[1], label = TRUE, abbr = FALSE)
  # })
}

shinyApp(ui = ui, server = server)

关键实现细节

  • 数据源绑定:通过shift_choices反应式函数,从df1中实时筛选当前选中工作日的班次,确保选项严格遵循配置数据。
  • 两种触发逻辑:
    1. 直接提供星期几选择框,快速匹配需求中“选择周日/周二”的场景。
    2. 从日期范围中提取星期几(注释部分),适合需要基于实际日期而非直接选星期几的场景。
  • 动态更新方式:使用renderUI动态生成班次选择框,也可改用updateSelectInput更新固定组件,两种方式均能实现动态更新效果。

效果验证

  • 选择Sunday时,班次选项显示Morning和Evening。
  • 选择Tuesday时,班次选项仅显示Evening。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 01:31:19