2016-08-05 45 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

相关问题