You need to enable JavaScript to run this app. R Shiny使用read.xlsx报invalid 'description' argument错误求解
优惠活动
大模型
产品
解决方案
定价
更多

R Shiny使用read.xlsx报invalid 'description' argument错误求解

R Shiny多Excel上传合并报错解决方案

报错根因

你遇到的Error in file: invalid 'description' argument报错核心原因是没有对上传文件是否存在做校验:当用户还未上传任何文件时,input$files为NULL,此时你直接执行length(input$files[,1])会触发空值索引错误,传到read.xlsx里的路径参数自然无效。
另外你原来的索引写法冗余且容易出错,也会增加报错概率。

datapath参数含义

fileInput组件返回的结果是一个数据框,每一行对应一个用户上传的文件,共包含4个字段:name(用户本地原始文件名)、size(文件大小)、type(文件类型)、datapath。
其中datapath存储的是Shiny服务端为用户上传文件生成的临时存储绝对路径:出于安全考虑,用户上传的文件不会直接保留原始文件名存放在服务端,而是会写入服务端临时目录生成随机命名的临时文件,你要读取上传文件的内容,必须通过datapath字段的路径才能访问,直接用name字段的原始文件名是找不到服务端文件的。

修复后完整代码

library(shiny)
library(openxlsx)
library(tidyverse)

# Define UI for data upload app ----
ui <- fluidPage(
  # App title ----
  titlePanel("Tracking Statistical Programming Project Timelines"),
  # Sidebar layout with input and output definitions ----
  sidebarLayout(
    # Sidebar panel for inputs ----
    sidebarPanel(
      # Input: Select a file ----
      fileInput("files", "Choose XLSX File(s)",
                multiple = TRUE,
                accept = ".xlsx")
    ),
    # Main panel for displaying outputs ----
    mainPanel(
      # Output: Data file ----
      tableOutput("contents")
    )
  )
)

# Define server logic to read selected file ----
server <- function(input, output) {
  output$contents <- renderTable({
    # 新增校验:没有上传文件时直接终止运行,不报错
    req(input$files)
    
    # 简化读取逻辑,直接遍历datapath列读取并合并
    total <- input$files$datapath %>%
      map_dfr(~read.xlsx(.x), .id = "column_label")
    
    date <- "([0-1]*[0-9][/][0-3]*[0-9][/][0-2]*[0-9]*[0-9]{2})"
    
    total <- total %>%
      select(`ENTER.DATE`, `PROJECT.TYPE`, `PROJECT.NAME`, `STUDY.INVOLVED`, `KEY.MILESTONES`, TASK, SCOPE, PROGRAMMER, `SNAPSHOT.DATE`, `DUE.DATE`, `%COMPLETION`, `START.DATE`, `END.DATE`, ACCOMPLISHED, `RESOURCE.LOCATION`, NOTES, BIOSTATS, `EXTERNAL.TIMELINE`) %>%
      mutate(`SNAPSHOT.DATE` = str_extract(`SNAPSHOT.DATE`, date),
             `DUE.DATE` = str_extract(`DUE.DATE`, date))
    
    return(total)
  })
}

# Create Shiny app ----
shinyApp(ui, server)

优化说明

  • 移除了冗余加载的readxl、dplyr包,tidyverse已经包含dplyr,文件读取统一用openxlsx的read.xlsx避免包冲突
  • 用tidyverse风格的map_dfr直接合并文件,无需手动创建列表再拼接,代码更简洁
  • 所有索引逻辑直接操作input$files$datapath向量,避免二维表索引的潜在错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 17:24:03