Ho uno script R per caricare più file di testo in una directory e salvare i dati come .rda compresso. Ecco come si presenta,carica nuovi file nella directory
#!/usr/bin/Rscript --vanilla
args <- commandArgs(TRUE)
## arg[1] is the folder name
outname <- paste(args[1], ".rda", sep="")
files <- list.files(path=args[1], pattern=".txt", full=TRUE)
tmp <- list()
if(file.exists(outname)){
message("found ", outname)
load(outname)
tmp <- get(args[1]) # previously read stuff
files <- setdiff(files, names(tmp))
}
if(is.null(files))
message("no new files") else {
## read the files into a list of matrices
results <- plyr::llply(files, read.table, .progress="text")
names(results) <- files
assign(args[1], c(tmp, results))
message("now saving... ", args[1])
save(list=args[1], file=outname)
}
message("all done!")
I file sono abbastanza grandi (15Mb ciascuna, 50 di loro in genere), in modo da eseguire questo script richiede fino a un paio di minuti in genere, una parte sostanziale della quale è preso a scrivere il .rda risultati.
Aggiorno spesso la directory con nuovi file di dati, quindi desidero aggiungerli ai dati precedentemente salvati e compressi. Questo è ciò che faccio sopra controllando se c'è già un file di output con quel nome. L'ultimo passaggio è ancora piuttosto lento, salvando il file .rda.
C'è un modo più intelligente di fare questo in un pacchetto, tenere traccia di quali file sono stati letti e di salvarlo più velocemente?
Ho visto che knitr
utilizza tools:::makeLazyLoadDB
per salvare i calcoli memorizzati nella cache, ma questa funzione non è documentata, quindi non sono sicuro di dove abbia senso utilizzarlo.
è molto più veloce, grazie. – baptiste