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

Shiny应用中基于日期范围子集化数据集时日期列读取异常问题

问题解决:基于日期范围更新区域选择器

问题分析

你的代码存在两个核心问题:

  1. 子集化后未提取目标列:直接将整个子集数据框传给updatePickerInput的choices参数,导致下拉框显示整行数据而非区域名称。
  2. 日期类型不匹配:dateRangeInput返回Date类型,而数据中的Approval date Year Trend是POSIXct类型,直接比较可能因时间部分差异导致筛选结果不符合预期。

修正后的完整代码

## app.R ##
library(shiny)
library(shinydashboard)
library(shinyjs)
library(htmlwidgets)
library(shinyWidgets)

x1 <- data.frame(
  structure(list(`Approval date Year Trend` = structure(c(1421107200, 
                                                          1424217600, 1424217600, 1425254400, 1425340800, 1425340800, 1425427200, 
                                                          1425600000, 1426032000, 1426032000, 1426032000, 1426032000, 1426464000, 
                                                          1427241600, 1427414400, 1427846400, 1427846400, 1427846400, 1427846400, 
                                                          1427846400), tzone = "UTC", class = c("POSIXct", "POSIXt")), 
                 `REGION NAME` = c("Central", "Multinational", "East", "South", 
                                   "East", "East", "East", "West", "East", "Multinational", 
                                   "Multinational", "Multinational", "West", "East", "South", 
                                   "South", "East", "East", "North", "Multinational")), row.names = c(NA, 
                                                                                                      -20L), class = c("tbl_df", "tbl", "data.frame"))
)

ui <- dashboardPage(
  dashboardHeader(
    title="Task Managers' Workload Analysis",
    titleWidth = 400
  ),
  dashboardSidebar(),
  dashboardBody(
    tabsetPanel(
      tabPanel("Lending Approvals",
               fluidRow(
                 column(2,
                        dateRangeInput("daterange", "Date range:",
                                       start  = min(x1$`Approval date Year Trend`),
                                       end    = max(x1$`Approval date Year Trend`),
                                       separator = " - ")      
                 ),   
                 column(2,
                        pickerInput(
                          inputId = "reg",
                          label = "Select region",
                          # 初始化显示所有区域
                          choices = unique(x1$`REGION NAME`),
                          selected = unique(x1$`REGION NAME`)[1],
                          multiple = TRUE,
                          options = list(
                            `actions-box` = TRUE,
                            `deselect-all-text` = "None...",
                            `select-all-text` = "Yeah, all !",
                            `none-selected-text` = "zero"
                          )
                        )
                 )
               )
      )
    )
  )
)

server <- function(input, output,session) {
  shiny::observeEvent(input$daterange, {
    # 将输入的日期范围转换为POSIXct类型,匹配数据中的日期格式
    start_date <- as.POSIXct(input$daterange[1], tz = "UTC")
    end_date <- as.POSIXct(input$daterange[2], tz = "UTC")
    
    # 子集化数据并提取唯一的区域名称
    subsets1 <- subset(x1, 
                       `Approval date Year Trend` >= start_date & 
                         `Approval date Year Trend` <= end_date)
    unique_regions <- unique(subsets1$`REGION NAME`)
    
    shinyWidgets::updatePickerInput(
      session = session,
      inputId = "reg",
      choices = unique_regions,
      # 默认选中第一个区域(如果有结果)
      selected = if(length(unique_regions) > 0) unique_regions[1] else NULL
    )
  })
}

shinyApp(ui, server)

关键修改说明

  • 日期类型统一:将dateRangeInput返回的日期转换为POSIXct类型(与数据中的日期列类型一致),确保筛选逻辑准确。
  • 提取目标列:子集化后专门提取REGION NAME列的唯一值,作为pickerInput的选项。
  • 初始化选项:在ui中预先设置pickerInput的初始选项为所有区域,提升页面加载体验。
  • 空值处理:添加判断,避免当筛选结果为空时出现错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 04:17:12