R Shiny: 小时维度sliderInput与reactive联动实现绘图时间范围筛选问题求助
问题根因
- 核心类型错配:原始
heure列实际为字符型,未按需求转为hms类型,无法和时间型控件的返回值直接比较 - 范围完全错位:
sliderInput初始设置的时间范围为10:00:00-23:00:00,但测试数据的时间全部为01:05:30-01:05:39,完全落在滑块取值范围外,初始过滤后无任何数据展示 - 比较逻辑失效:
sliderInput默认返回POSIXct类型时间值,与字符型/hms类型的heure列比较时,逻辑判断不生效,拖动滑块无法更新展示范围
修复方案
- 数据预处理:生成
df_test后,执行df_test$heure <- as_hms(df_test$heure)将字符型时间列转为hms类型,匹配业务存储要求 - 适配滑块参数:若需展示当前测试数据,将滑块的min/max/value修改为适配01:00-02:00的时间范围;若需保留原10:00-23:00的滑块范围,可同步修改测试数据的时间为对应区间
- 统一比较类型:过滤前将滑块返回值转为与
heure列一致的hms类型,保证过滤逻辑生效
修复后可运行代码
library(shiny) library(ggplot2) library(dplyr) library(lubridate) # 生成测试数据 route_fond_degre <- c(1:10) heure <- c("01:05:30","01:05:31","01:05:32","01:05:33","01:05:34","01:05:35","01:05:36","01:05:37","01:05:38","01:05:39") df_test <- data.frame(heure, route_fond_degre) # 主动转换为hms类型 df_test$heure <- as_hms(df_test$heure) ui <- fluidPage( # 调整滑块范围适配当前测试数据,可按需自行修改时间区间 sliderInput(inputId = "periode", label = "Période", min = as_hms("01:00:00"), max = as_hms("02:00:00"), value = c(as_hms("01:00:00"), as_hms("02:00:00")), timeFormat = "%H:%M:%S"), plotOutput("graph1") ) server <- function(input, output) { date_filtre <- reactive({ mini <- input$periode[1] maxi <- input$periode[2] data_sel <- df_test %>% filter(heure >= mini & heure <= maxi) return(data_sel) }) output$graph1 <- renderPlot({ ggplot(date_filtre(), aes(x = heure, y = route_fond_degre)) + geom_point() }) } shinyApp(ui = ui, server = server)
内容的提问来源于stack exchange,提问作者Carine44
相关产品推荐
相关产品推荐

