调整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
相关产品推荐
相关产品推荐

