如何在Shiny中关联日历选择器与textInput 选中日期自动显示对应星期
实现方案
你只需要在server函数中添加对日期选择器值变化的监听逻辑,调用Shiny内置的updateTextInput方法即可动态更新textInput的显示内容,无需修改原有业务逻辑。我们直接使用已加载的lubridate包计算对应日期的星期,和你给出的示例效果完全匹配。
具体修改步骤
- 在现有
server函数的末尾添加如下监听代码即可:
# 监听日期选择变化,自动更新星期显示 observeEvent(input$date, { # 计算所选日期对应的英文星期全称 selected_week <- wday(input$date, label = TRUE, abbr = FALSE, locale = "en_US.UTF-8") updateTextInput(session, "week", value = as.character(selected_week)) }, ignoreNULL = FALSE)
参数ignoreNULL = FALSE的作用是应用初始化加载时,自动显示默认选中日期对应的星期,无需手动选择触发。
修改后完整可运行代码
library(shiny) library(shinythemes) library(dplyr) library(ggplot2) library(tidyr) library(lubridate) function.cl<-function(dt){ df <- structure( list(date = c("01-08-2021","01-08-2021","01-08-2021","01-08-2021","01-08-2021", "08-08-2021","08-08-2021","08-08-2021","08-08-2021","08-08-2021","08-08-2021", "13-08-2021","13-08-2021","13-08-2021","13-08-2021","13-08-2021"), Week= c("Sunday","Sunday","Sunday","Sunday","Sunday","Sunday","Sunday","Sunday", "Sunday","Sunday","Sunday","Friday","Friday","Friday","Friday","Friday"), D1 = c(0,1,0,0,5,0,1,0,0,9,4,3,4,5,6,7), DR01 = c(2,1,0,0,3,0,1,0,1,7,2,3,4,6,7,8), DR02 = c(2,0,0,0,4,2,1,0,1,4,2,3,4,5,6,7), DR03 = c(2,0,0,2,6,2,0,0,1,5,2,2,4,5,7,5), DR04 = c(2,0,0,5,6,2,0,0,3,7,2,3,4,5,6,4), DR05 = c(2,0,0,5,6,2,0,0,7,7,2,3,4,5,6,7), DR06 = c(2,0,0,5,7,2,0,0,7,7,1,3,5,6,7,8), DR07 = c(2,0,0,6,9,2,0,0,7,8,1,3,5,6,4,3)), class = "data.frame", row.names = c(NA, -16L)) df$date <- parse_date_time(df$date, c('ymd', 'dmy')) scatter_date <- function(dt, dta = df) { dta %>% filter(date == ymd(dt)) %>% summarize(across(starts_with("DR"), sum)) %>% pivot_longer(everything(), names_pattern = "DR(.+)", values_to = "val") %>% mutate(name = as.numeric(name)) %>% plot(xlab = "Days", ylab = "Types", xlim = c(0, 7)) } Plot1<-scatter_date(dt) return(list( "Plot1" = Plot1, date = df$date )) } ui <- fluidPage( ui <- shiny::navbarPage(theme = shinytheme("flatly"), collapsible = TRUE, br(), tabPanel("", sidebarLayout( sidebarPanel( uiOutput("date"), textInput("week", label = h3("Week"), value = ""), br(), ), mainPanel( tabsetPanel( tabPanel("",plotOutput("Graph",width = "95%", height = "600"))), )) ))) server <- function(input, output,session) { data <- reactive(function.cl("2021-08-01")) output$date <- renderUI({ all_dates <- seq(as.Date('2021-01-01'), as.Date('2021-01-15'), by = "day") disabled <- as.Date(setdiff(all_dates, as.Date(data()$date)), origin = "1970-01-01") dateInput(input = "date", label = "Select Date", min = min(data()$date), max = max(data()$date), value = max(data()$date), format = "dd-mm-yyyy", datesdisabled = disabled) }) output$Graph <- renderPlot({ req(input$date) function.cl(input$date)[["Plot1"]] }) # 新增的监听更新逻辑 observeEvent(input$date, { selected_week <- wday(input$date, label = TRUE, abbr = FALSE, locale = "en_US.UTF-8") updateTextInput(session, "week", value = as.character(selected_week)) }, ignoreNULL = FALSE) } shinyApp(ui = ui, server = server)
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

