繁体   English   中英

文件错误(描述 = xlsxFile):使用 lapply 时“描述”参数无效

[英]Error in file(description = xlsxFile) : invalid 'description' argument when using lapply

我使用下面的代码从同一文件夹中的多个 excel 工作表中提取数据,这些工作表来自名为“table”的工作表。 一周前这段代码对我有用,

library(readxl)
library(openxlsx)

path = "S:\\YJB\\Shared\\corpdata\\Community Division\\Team\\Divisional BAU\\21. Serious Incidents from June 2021\\Serious Incidents Notification Forms\\All_Data"
filenames <- dir(path, pattern ="*.xlsx")
filenames <- paste("S:\\YJB\\Shared\\corpdata\\Community Division\\Team\\Divisional BAU\\21. Serious Incidents from June 2021\\Serious Incidents Notification Forms\\All_Data\\", filenames, sep = "")

SheetList <- lapply("Table",openxlsx::read.xlsx,xlsxFile=filenames)

但是现在当运行这条线

SheetList <- lapply("Table",openxlsx::read.xlsx,xlsxFile=filenames)

我收到错误信息

Error in file(description = xlsxFile) : invalid 'description' argument

谁能告诉我发生了什么事?

您正在迭代错误的向量/列表。

read.xlsx一个文件名(顺便说一句,还有一张表/工作表),但是(我推断)您的filenames object 包含多个文件。 我可以重现这个:

filenames <- list.files("~/Downloads/", pattern="xlsx$", full.names=TRUE)
length(filenames)
# [1] 2
openxlsx::read.xlsx(filenames)
# Error in file(description = xlsxFile) : invalid 'description' argument
lapply("Table", openxlsx::read.xlsx, xlsxFile = filenames)
# Error in file(description = xlsxFile) : invalid 'description' argument

相反,由于您只从文件中检索一张纸,因此遍历filenames

alldata <- lapply(filenames, openxlsx::read.xlsx, sheet = "Table")

如果要从所有工作表中查询多个表,则需要遍历filenames和表名/索引的向量。 两种方式,产生两种不同的结构。

  1. 数据列表列表,

     alldata <- lapply(filenames, function(fn) lapply(tablenames, openxlsx::read.xslx, xlsxFile = fn))
  2. 单个列表,尽管如何通过 name索引特定文件的表不太明显。

     eg <- expand.grid(filename = filenames, tablename = c("Table1", "Table2")) eg # filename tablename # 1 c:/Users/r2/Downloads/workbook1.xlsx Table1 # 2 c:/Users/r2/Downloads/workbook2.xlsx Table1 # 3 c:/Users/r2/Downloads/workbook1.xlsx Table2 # 4 c:/Users/r2/Downloads/workbook2.xlsx Table2 alldata <- Map(openxlsx::read.xlsx, eg$filename, eg$tablename)

笔记:

  • list.filesdir的参数pattern=是一个正则表达式,因此您的pattern="*.xlsx"可以正常工作,但您不应依赖类似“glob”的模式。 相反,使用pattern="\\.xlsx$"或只是pattern="xlsx$"
  • 而不是将目录名称paste到文件名中,只需在原始调用中使用dir(..., full.names=TRUE) 如果您有时需要将实际的文件名组件分开,还有另外两个函数basename (从路径中提取文件名或顶级目录)和dirname (提取所有确切的basename组件)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM