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

R Shiny加载多Sheet Excel文件报错:path must be a string

解决Shiny中合并Excel多Sheet时的"path must be a string"错误

问题概况

上传包含8个Sheet的xlsx文件,尝试用bind_rows合并所有Sheet为单个DataFrame,运行Shiny应用时无输出,报错:

Error : path must be a string

错误原因

  1. 未处理初始空状态:应用启动时input$file1为NULL,直接访问fname$datapath会让excel_sheets等函数接收到无效参数,触发路径非字符串的错误。
  2. 文件路径传递错误:调用read_excel时传入的是完整的fileInput对象fname,而非实际文件路径字符串fname$datapath。

修正后的完整代码

library(shiny)
library(readxl)
library(tidyverse)
library(dplyr)

# Define UI for application
ui <- fluidPage(
  # Application title
  titlePanel("SDV Complaince Report"),
  # Sidebar with file input
  sidebarLayout(
    sidebarPanel(
      fileInput("file1", "Choose Excel File",
                multiple = FALSE,
                accept = c(".xls", ".xlsx"))
    ),
    # Show merged table output
    mainPanel(
      tableOutput("contents")
    )
  )
)

# Define server logic required
server <- function(input, output) {
  output$contents <- renderTable({
    # 确保文件已上传后再执行后续逻辑
    req(input$file1)
    
    fname <- input$file1
    # 获取所有Sheet名称
    sheets <- excel_sheets(fname$datapath)
    
    # 读取每个Sheet,注意传入的是datapath而非整个file对象
    data_frames <- lapply(setNames(sheets, sheets), 
                         function(x) read_excel(fname$datapath, sheet = x, col_names = FALSE))
    
    # 转换第5列(...5)为数值型
    for(i in seq_along(data_frames)) {
      data_frames[[i]]$...5 <- as.numeric(data_frames[[i]]$...5)
    }
    
    # 合并所有Sheet,添加Sheet列标记来源
    bind_rows(data_frames, .id = "Sheet")
  })
}

# Run the application 
shinyApp(ui = ui, server = server)

关键修正点

  • 添加req(input$file1):阻止应用在未上传文件时执行后续代码,避免空值引发的错误。
  • 修正read_excel的路径参数:将fname改为fname$datapath,传递正确的文件路径字符串。
  • 变量名优化:将data_frame改为data_frames(复数形式更符合存储多个Sheet数据的语义)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 13:56:41