Ivan Krylov points out that load(file, e <- new.env()) is cumbersome. I put it into a function.
Regards, Jorgen Harmse. #' Save & load lists & environments #' #' \code{\link{save}} has to be told what to save from an environment, and the obvious way #' to save a structure creates an extra layer. \code{\link{load}} with default settings #' clobbers the current environment. \code{save.env} saves a list or environment without an #' extra layer, and by default saves everything. \code{load.env} loads into an environment, #' and \code{load.list} loads into a list. #' #' @param S something that can be coerced to an environment, e.g. a named \code{list} #' @param file,envir inputs to \code{save} or \code{load} #' @param list input to \code{save} #' @param skip variables in \code{envir} that should not be saved, ignored if \code{list} #' is provided #' @param ... inputs to \code{load.env} or additional inputs to \code{save} #' #' @return \code{invisible} from \code{save.env}; an \code{environment} from \code{load.env}; #' a \code{list} from \code{load.list} #' #' @export save.env <- function( S, file, list = setdiff(ls(envir),skip), envir = if(missing(S)) parent.frame() else as.environment(S), skip=NULL, ... ) { save(list=list, file=file, envir=envir, ...)} #' @rdname save.env #' #' @param keep,remove names of variables to keep or to remove #' @param absent what to do if variables named in \code{keep} are absent #' @param parent input to \code{\link{new.env}} #' #' @note \code{remove} is forced after the file is loaded, so the default works correctly. #' #' @export load.env <- function( file, keep, remove = if(!missing(keep)) setdiff(ls(envir),keep), absent=c('warn','ignore','stop'), envir=new.env(parent=parent), parent=parent.frame() ) { load(file,envir) rm(list=remove,envir=envir) if ( !missing(keep) && (match.arg(absent) -> absent) != 'ignore' && length(keep.absent <- setdiff(keep,ls(envir))) > 0L ) { print(keep.absent) if (absent=='warning') warning('The variables listed above are absent from the file.') else stop('The variables listed above are absent from the file.') } return(envir) } #' @rdname save.env #' #' @param all.names input to \code{\link{as.list}} #' #' @export load.list <- function(..., all.names=TRUE) as.list(all.names=all.names, load.env(...)) ------------------------------ Message: 2 Date: Fri, 29 Sep 2023 11:42:37 +0300 From: Ivan Krylov <krylov.r...@gmail.com> To: Shu Fai Cheung <shufai.che...@gmail.com> Cc: R mailing list <r-help@r-project.org> Subject: Re: [R] save(), load(), saveRDS(), and readRDS() Message-ID: <20230929114237.2592975a@Tarkus> Content-Type: text/plain; charset="utf-8" On Thu, 28 Sep 2023 23:46:45 +0800 Shu Fai Cheung <shufai.che...@gmail.com> wrote: > In my personal work, I prefer using saveRDS() and loadRDS() as I > don't like the risk of overwriting anything in the global > environment. There's the load(file, e <- new.env()) idiom, but that's potentially a lot to type. ********* [[alternative HTML version deleted]] ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.