Mi sono trovato nella posizione di dover aggiornare uno o due oggetti dati in un file Rdata precedentemente creato utilizzando save
. Se non sto attento a caricare il file, posso dimenticare di ri-salvare alcuni oggetti nel file. Ad esempio, sto lavorando su un pacchetto con alcuni oggetti memorizzati in sysdata.rda
(tabelle di ricerca per uso interno che non voglio esportare) e voglio solo preoccuparmi di aggiornare singoli oggetti.Aggiornamento di un file Rdata esistente
Non sono riuscito a capire se esiste un modo standard per farlo, quindi ho creato la mia funzione.
resave <- function (..., list = character(), file = stop("'file' must be specified")) {
# create a staging environment to load the existing R objects
stage <- new.env()
load(file, envir=stage)
# get the list of objects to be "resaved"
names <- as.character(substitute(list(...)))[-1L]
list <- c(list, names)
# copy the objects to the staging environment
lapply(list, function(obj) assign(obj, get(obj), stage))
# save everything in the staging environment
save(list=ls(stage, all.names=TRUE), file=file)
}
Tuttavia, sembra eccessivo. C'è un modo migliore/più semplice per farlo?
Per inciso, ho ragione nel presumere che un nuovo ambiente creato nell'ambito di una funzione venga distrutto dopo la chiamata di funzione?
Fa sì che uno (o almeno io :-)) si chieda perché 'save' non ha l'opzione" aggiungi ". Chiederò r-help e tornerò qui se c'è una risposta utile. –
Ok, ho guardato: https://stat.ethz.ch/pipermail/r-help/2006-March/101259.html fornisce sostanzialmente lo stesso suggerimento della risposta fornita da @flodel. Personalmente mi piacerebbe vedere questo inserito nella funzione di base 'save' come opzione" append = T ", ma non è un grosso problema. –
Ho usato 'as.character (sostituto (lista (...))) [- 1L]' (copia da 'save'). Guardando la risposta alla mailing list, viene usato 'deparse' piuttosto che' as.character'. Quali sono i pro/contro dei due approcci? – seancarmody