[英]R Openxlsx package (version 4.2.2) - Error in file(description = xlsxFile) : invalid 'description' argument
[英]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
和表名/索引的向量。 两种方式,产生两种不同的结构。
数据列表列表,
alldata <- lapply(filenames, function(fn) lapply(tablenames, openxlsx::read.xslx, xlsxFile = fn))
单个列表,尽管如何通过 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.files
和dir
的参数pattern=
是一个正则表达式,因此您的pattern="*.xlsx"
可以正常工作,但您不应依赖类似“glob”的模式。 相反,使用pattern="\\.xlsx$"
或只是pattern="xlsx$"
;paste
到文件名中,只需在原始调用中使用dir(..., full.names=TRUE)
。 如果您有时需要将实际的文件名组件分开,还有另外两个函数basename
(从路径中提取文件名或顶级目录)和dirname
(提取所有确切的basename
组件)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.