Updating an existing Rdata file
Here is a slightly shorter version:
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)}
I took advantage of the fact the load
function returns the name of the loaded variables, so I could use the function's environment instead of creating one. And when using get
, I was careful to only look in the environment from which the function is called, i.e. parent.frame()
.
Here is a simulation:
x1 <- 1x2 <- 2x3 <- 3save(x1, x2, x3, file = "abc.RData")x1 <- 10x2 <- 20x3 <- 30resave(x1, x3, file = "abc.RData")load("abc.RData")x1# [1] 10x2# [1] 2x3# [1] 30
I have added a refactored version of @flodel's answer in the stackoverflow package. It uses environments explicitly to be a bit more defensive.
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)}