readrds - save rds r
Actualizando un archivo Rdata existente (2)
Aquí hay una versión ligeramente más corta:
resave <- function(..., list = character(), file) {
previous <- load(file)
var.names <- c(list, as.character(substitute(list(...)))[-1L])
for (var in var.names) assign(var, get(var, envir = parent.frame()))
save(list = unique(c(previous, var.names)), file = file)
}
Aproveché el hecho de que la función de load
devuelve el nombre de las variables cargadas, por lo que podría usar el entorno de la función en lugar de crear uno. Y al usar get
, tuve cuidado de mirar solo en el entorno desde el que se llama la función, es decir, parent.frame()
.
Aquí hay una simulación:
x1 <- 1
x2 <- 2
x3 <- 3
save(x1, x2, x3, file = "abc.RData")
x1 <- 10
x2 <- 20
x3 <- 30
resave(x1, x3, file = "abc.RData")
load("abc.RData")
x1
# [1] 10
x2
# [1] 2
x3
# [1] 30
Me he encontrado en la posición de necesitar actualizar uno o dos objetos de datos en un archivo Rdata creado previamente usando save
. Si no tengo cuidado de cargar el archivo, puedo olvidar volver a guardar algunos objetos en el archivo. Como ejemplo, estoy trabajando en un paquete con algunos objetos almacenados en sysdata.rda
(tablas de consulta para uso interno que no deseo exportar) y solo quiero preocuparme por actualizar objetos individuales.
No he podido trabajar si hay una forma estándar de hacerlo, así que creé mi propia función.
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)
}
Aunque parece una exageración. ¿Hay una manera mejor / más fácil de hacer esto?
Aparte, ¿tengo razón al suponer que un nuevo entorno creado en el ámbito de una función se destruye después de la llamada de función?
He añadido una versión refactorizada de la respuesta de @ flodel en el paquete . Utiliza los entornos explícitamente para ser un poco más defensivo.
resave <- function(..., list = character(), file) {
e <- new.env()
load(file, e)
list <- union(list, as.character(substitute((...)))[-1L])
copyEnv(parent.frame(), e, list)
save(list = ls(e, all.names=TRUE), envir = e, file = file)
}