![](/img/trans.png)
[英]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.