我正在研究一個R中的小問題,我很好奇我是否可以使用purrr來迭代excel檔案和表單。
我已經看到了很多例子,其中map()被直接賦予可迭代物件,即map(1:6, function(x)...但我不確定當我想在第一個map呼叫中生成一個迭代器時是否/如何做到。
以這個例子為例,我們有一個 excel 檔案的檔案夾,我們想在每張表中運行同一個函式。因此,我們需要兩個回圈,一個是回圈瀏覽檔案,另一個是迭代瀏覽作業表。
library(tidyverse)
library(readxl)
fileList <- list.files()
customFunction < - function(xlsheet, filePath){>
return(1)
}
輸出 <- list()
i <- 1
for (file in fileList){
# 獲得每個檔案中的excel表的串列
sheet_list <- excel_sheets(file)
for (sheet in sheet_list){>
#將customFunction應用到每個檔案的每張紙上
output[[i]] < - customFunction(sheet, file)
i <- i 1
}
}
我認為我遇到的問題是,在每次呼叫customFunction()時,我需要來自第一個和第二個回圈的引數。
在另一個問題中查看了 @r2evans 提供的例子,他們似乎在描述這樣的事情:
map(fileList, ~ map(excel_sheets(. x), ~ customFunction(. x, .y)))。
但是在我的實際代碼中會回傳一個錯誤(在這個例子中,它回傳一個嵌套的串列,而不是像for回圈那樣回傳一個單一的串列,注意我的例子不會失敗,如果作業表和路徑沒有正確傳遞給customFunction)
is_string(path)中的錯誤:...串列中包含少于2個元素說實話,我對
。.x和.y的代名詞有點迷茫最后,如果用
purrr來做這件事很傻,而for回圈通常是一個更好的解決方案,那也是很好的反饋。uj5u.com熱心網友回復:
當你有嵌套的
map時,使用.x和.y可能會引起混淆。我通常喜歡使用一個匿名函式來明確,是的嵌套的map的會回傳嵌套的串列。你可以使用flatten來獲得一個大的串列,就像for回圈一樣,或者使用unlist與recursive = FALSE。library(purrr) flatten(map(fileList。 function(file) map(excel_sheets(file)。 function(sheet) customFunction(file, sheet))))轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/334058.html
標籤:
