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

