Eu quero ler vários arquivos. Para fazer isso, uso uma função genérica read_list
read_list(file_list, read_fun)
Atribuindo diferentes funções de leitura ao argumento read_fun
Posso ler diferentes tipos de arquivos, ou seja, read.csv
para ler csv
arquivos, read_dta
para arquivos STATA, etc.
Agora, eu preciso ler alguns csv
arquivos em que as primeiras quatro linhas precisam ser ignoradas. Assim, em vez de passar read.csv
como um argumento para read_list
, Eu gostaria de passar read.csv
com o skip
argumento definido como 4. É possível fazer isso em R? eu tentei
my_read_csv <- function(...){
read.csv(skip = 4, ...)
}
Parece funcionar, mas gostaria de confirmarque esta é a maneira certa de fazer isso. Acho que funções sendo objetos em R são um recurso fantástico e muito poderoso da linguagem, mas não estou muito familiarizado com fechamentos de R e regras de escopo, portanto, não quero cometer inadvertidamente grandes erros.
Respostas:
1 para resposta № 1Você pode simplesmente reescrever seu read_list
para adicionar o qualificador de argumento sem nome ...
no final e substitua a chamada para
read_fun(file)
com read_fun(file, ...)
.
Isso permitirá que você escreva a seguinte sintaxe:
read_list(files, read.csv, skip = 4)
o que será equivalente a usar seu atual read_list
com uma função de leitura personalizada:
read_list(files, function(file)read.csv(file, skip = 4))
Além disso, esteja ciente de que read_list
soa muito como uma função "reinventar a roda". Se você descrever o comportamento de read_list
um pouco mais, posso expandir.
Possíveis alternativas podem ser
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 para resposta № 2
Eu não tenho certeza se read_list
é especializado em sua tarefa específica de alguma forma, mas você pode usar lapply
junto com read.csv
para ler uma lista de arquivos:
# generate fake file names
files <- paste0("file_", 1:10, ".csv")
# Read files using lapply
dfs <- lapply(files, read.csv, skip = 4)
O terceiro argumento de lapply
é ...
que permite que você passe argumentos adicionais para a função que você está aplicando. Neste caso, podemos usar ...
passar o skip = 4
argumento para read.csv