[R] save(), load(), saveRDS(), and readRDS()
Jorgen Harmse
JH@rm@e @end|ng |rom roku@com
Fri Sep 29 21:44:47 CEST 2023
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.r00t using gmail.com>
To: Shu Fai Cheung <shufai.cheung using gmail.com>
Cc: R mailing list <r-help using r-project.org>
Subject: Re: [R] save(), load(), saveRDS(), and readRDS()
Message-ID: <20230929114237.2592975a using Tarkus>
Content-Type: text/plain; charset="utf-8"
On Thu, 28 Sep 2023 23:46:45 +0800
Shu Fai Cheung <shufai.cheung using 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]]
More information about the R-help
mailing list