簡體   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