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

能否将selectizeGroupUI模块与用户上传的响应式文件结合使用?

问题分析与修复方案

核心错误原因

报错根源是筛选模块初始绑定静态无效数据、未正确关联用户上传的响应式数据,同时存在模块ID不匹配、衍生列未提前生成、列名不匹配等问题,导致select方法无法作用于NULL对象。

具体修复点及完整代码

1. 修复global.R

调整日期格式处理逻辑(原代码中日期格式与输入数据不匹配会导致Year生成NA),移除测试用静态df避免干扰:

get_validated_summary_df <- function(df) {
  modified_data <- df %>%
    mutate(
      `Created Date` = as.Date(`Created Date`), # 统一转换为标准日期类型
      Quarter = quarters(`Created Date`),
      Year = format(`Created Date`, "%Y")
    )
  
  return(modified_data)
}

2. 修复app.R

关键调整:

  • 确保筛选模块UI与Server端ID完全一致
  • 将筛选模块绑定到用户上传并处理后的响应式数据
  • 提前生成Year、Quarter衍生列再传入筛选模块
  • 修正UI中筛选参数与数据列名的匹配问题
# Load Libraries
## Data Manipulation
library(DT)
library(data.table)
library(readxl)
library(tidyverse)

## Shiny
library(shiny)
library(shinybusy)
library(shinyWidgets)
library(shinydashboard)

# Custom funtion
`%nlike%` <- Negate(`%like%`)

# Define UI for the application
ui <- dashboardPage(
  dashboardHeader(title = "Assay Metrics"),
  dashboardSidebar(
    fileInput("file", "Data", buttonLabel = "Upload..."),
    sidebarMenu(menuItem(
      "Validated",
      tabName = "validated",
      icon = icon("ok", lib = "glyphicon")
    ))
  ),
  dashboardBody(tabItems(tabItem(
    tabName = "validated",
    tabPanel("Validated",
             fluidRow(
               tabBox(
                 width = 12,
                 title = "Validated Data",
                 id = "validated",
                 tabPanel(
                   "Validated Summary Chart and Graphs",
                   # 修复:模块ID与server端callModule的ID保持一致
                   selectizeGroupUI(
                     id = "validated_data_summary_filters",
                     params = list(
                       Year  = list(inputId = "year", title = "Year(s)"),
                       Quarter  = list(inputId = "quarter", title = "Quarter(s)"),
                       # 修复:列名与数据中的`Created Date`完全匹配
                       `Created Date`   = list(inputId = "created_date", title = "Created Date(s)")
                     )
                   ),
                   dataTableOutput("validated_data_summary"),
                   br(),
                   br(),
                   plotOutput("validated_graph_raw_data"),
                   br(),
                   br(),
                   plotOutput("validated_graph_percent_data")
                 )
               )
             ))
  )))
)

# Define server logic
server <- function(input, output) {
  # 上传原始数据
  raw_data_upload <- reactive({
    req(input$file)
    readxl::read_excel(path = input$file$datapath)
  })
  
  # 提前处理原始数据,生成Year、Quarter衍生列
  processed_data <- reactive({
    req(raw_data_upload())
    get_validated_summary_df(raw_data_upload())
  })
  
  # 修复:将筛选模块绑定到处理后的响应式数据
  validated_data_summary_filters <- callModule(
    module = selectizeGroupServer,
    id = "validated_data_summary_filters",
    data = processed_data,
    vars = c("Year", "Quarter", "Created Date")
  )
  
  # 渲染验证数据表格
  output$validated_data_summary <- renderDT({
    req(validated_data_summary_filters())
    
    validated_data_summary_filters() %>%
      datatable(
        class = 'cell-border stripe',
        rownames = FALSE,
        filter   = 'top',
        extensions = c('Select', 'SearchPanes', 'Buttons'),
        options = list(
          pageLength = 10,
          lengthMenu = list(c(10,25,100,500), c(10,25,100,500)),
          paging     = TRUE,
          scrollX    = TRUE,
          dom        = 'PBlfrtip',
          buttons    = c('csv', 'excel', 'colvis'),
          columnDefs = list(
            list(
              searchPanes = list(show = FALSE),
              targets = c(0:3)
            ),
            list(className = 'dt-center', targets = "_all")
          )
        )
      )
  }, server = FALSE)
  
  # 示例绘图函数(需自行补充业务逻辑)
  example_function <- function(df) {
    req(df)
    ggplot(df, aes(x = Year)) +
      geom_bar(fill = "#2c3e50") +
      theme_minimal()
  }
  
  output$validated_graph_raw_data <- renderPlot({
    example_function(validated_data_summary_filters())
  })
  
  output$validated_graph_percent_data <- renderPlot({
    example_function(validated_data_summary_filters())
  })
}

# Run the application
shinyApp(ui, server)

修复后说明

  1. 筛选模块会等待用户上传文件后才初始化,避免NULL数据报错
  2. 衍生列提前生成并传入筛选模块,确保筛选器能识别这些列
  3. UI与Server端的模块ID、列名完全匹配,消除参数不对应问题
  4. 用req()确保所有依赖数据非空时才执行渲染,提升应用稳定性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 13:59:59