/ / Atribuir read.csv com alguns parâmetros definidos a um nome, a fim de passá-lo para uma função - r, função

Atribuir read.csv com alguns parâmetros definidos para um nome, a fim de passá-lo para uma função - r, função

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 № 1

Você 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