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

调整Shiny代码使图表按所选日期对应周几显示正确abline参考线

问题修复说明

你当前代码的问题是scatter_date函数内硬编码固定调用sum_Friday绘制水平参考线,没有根据用户选择的日期所属星期动态切换对应数值。
修改逻辑如下:

  • 在scatter_date函数内新增所选日期所属星期的判断逻辑
  • 根据判断结果动态选择sum_Sunday或sum_Friday作为参考线数值

核心修改片段

仅需替换原scatter_date函数的内容即可:

scatter_date <- function(dt, dta = df) {
  # 先获取所选日期对应的星期类型
  selected_week <- unique(dta$Week[dta$date == ymd(dt)])
  
  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),
         ylim = c((min(.$val) %/% 10) * 10, (max(.$val) %/% 10 + 1) * 15))
  # 动态选择参考线数值
  abline(h = ifelse(selected_week == "Sunday", sum_Sunday, sum_Friday), col='blue') 
}

完整可运行代码

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(4,2,3,1,2,1,1,1,2,2,4,3,5,4,2,3), DR01 = c(2,1,4,6,3,0,1,0,1,2,2,3,2,2,7,1),
         DR02 = c(4,0,0,12,4,5,1,0,1,4,2,3,4,2,2,1),  DR03 = c(2,6,13,2,2,2,0,0,1,5,2,2,4,5,3,2),
         DR04 = c(5,4,0,12,6,4,0,0,3,2,2,3,4,2,2,1),  DR05 = c(2,6,0,5,6,2,0,0,2,2,2,3,2,5,3,2),
         DR06 = c(4,0,0,5,2,2,0,0,2,2,1,3,5,2,2,2),  DR07 = c(2,0,7,6,2,2,0,0,2,2,1,3,2,2,2,1)),
    class = "data.frame", row.names = c(NA, -16L))
  
  
  
  sum_Sunday <-sum(with(df, D1[Week == 'Sunday']))
  sum_Friday <- sum(with(df, D1[Week == 'Friday']))
  
  df$date <- parse_date_time(df$date, c('ymd', 'dmy'))
  
  scatter_date <- function(dt, dta = df) {
    selected_week <- unique(dta$Week[dta$date == ymd(dt)])
    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),
           ylim = c((min(.$val) %/% 10) * 10, (max(.$val) %/% 10 + 1) * 15))
    abline(h = ifelse(selected_week == "Sunday", sum_Sunday, sum_Friday), col='blue') 
  }  
  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"),
                                       
                                       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"]]
    
  })
}

shinyApp(ui = ui, server = server)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 11:27:03