2016-08-05 27 views
0

我想讀取多個文件。要做到這一點我使用一個通用的功能read_list將一些設置參數的read.csv分配給一個名稱,以便將它傳遞給函數

read_list(file_list, read_fun) 

的說法read_fun分配不同的讀取功能,我可以閱讀csv文件,read_dta爲STATA文件等

閱讀不同類型的文件,即read.csv的現在,我需要閱讀一些csv文件,其中前四行需要跳過。因此,我不想將read.csv作爲參數傳遞給read_list,我想通過read.csv並將skip參數設置爲4.是否可以在R中執行此操作?我試過

my_read_csv <- function(...){ 
read.csv(skip = 4, ...) 
} 

這似乎工作,但我想確認這是正確的方式來做到這一點。我認爲R中的函數是對象是一個奇妙而強大的語言功能,但我對R閉包和範圍規則並不是很熟悉,因此我不想無意中犯下一些重大錯誤。

回答

1

你可以簡單地重寫read_list在結尾處添加未命名參數預選賽...,然後用read_fun(file, ...)更換呼叫 read_fun(file)

這將允許你寫的語法如下:

read_list(files, read.csv, skip = 4) 

至極將等同於使用當前read_list與cusom讀取功能:

read_list(files, function(file)read.csv(file, skip = 4)) 

而且,要知道,read_list聲音非常像「重新發明輪子」功能。如果你多描述一下read_list的行爲,我可以擴展。
可能的替代可能是

read_list <- function(files, read_fun, ...)lapply(files, read_fun, ...) 
# in this case read_list is identical to lapply 
read_list <- function(files, read_fun, ...)do.call(rbind, lapply(files, read_fun, ...)) 
# This will rbind() all the files to one data.frame 
+0

你的建議很有趣,但我不知道這是一般。我的意思是,如果我想傳遞不同於'skip'的參數,是否需要修改'read_list'代碼?如果是這樣,那麼響應是不可接受的:在每次需要設置不同的參數時,將read.csv包裝在不同的'my_read_csv'函數中顯然比每次修改'read_list'更具本地性。否則,您的解決方案是最佳的。我會測試它並讓你知道。 – DeltaIV

+1

@DeltaIV不,你沒有。您可以將任何參數傳遞給底層函數。 – AlexR

+0

關於'read_list'的結構,當然它包含'lapply',但它的優越性在於它允許我爲每個數據集分配一個名稱,從文件名派生。這是非常有用的,因爲在我的應用程序中,文件名包含有用的信息,然後在另一個「merge_list」函數的'do.call'步驟之前解析。如果您想查看代碼,我的實現與[this]非常相似(http://www.brodrigues.co/2016/07/26/read-a-lot-of-datasets-at-once -with-r),但有一些細微的差別(與我的特定應用程序有關的調整)。 – DeltaIV

0

我不知道,如果read_list是專門給你特定的任務以某種方式,但你可以使用帶有read.csv一起lapply讀取文件的列表:

# generate fake file names 
files <- paste0('file_', 1:10, '.csv') 

# Read files using lapply 
dfs <- lapply(files, read.csv, skip = 4) 

lapply第三個參數是...這允許您將其他參數傳遞給您正在應用的函數。在這種情況下,我們可以使用...skip = 4參數傳遞給read.csv

相關問題