blob: 105f0b4a33cc0a1a2e8a712b1a31a0a3df57c41a [file] [log] [blame]
# File src/library/base/R/load.R
# Part of the R package, https://www.R-project.org
#
# Copyright (C) 1995-2015 The R Core Team
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# A copy of the GNU General Public License is available at
# https://www.R-project.org/Licenses/
load <- function (file, envir = parent.frame(), verbose = FALSE)
{
if (is.character(file)) {
## files are allowed to be of an earlier format
## gzfile can open gzip, bzip2, xz and uncompressed files.
con <- gzfile(file)
on.exit(close(con))
## Since the connection is not open this opens it in binary mode
## and closes it again.
magic <- readChar(con, 5L, useBytes = TRUE)
if (!length(magic)) stop("empty (zero-byte) input file")
if (!grepl("RD[ABX][2-9]\n", magic)) {
## a check while we still know the call to load()
if(grepl("RD[ABX][2-9]\r", magic))
stop("input has been corrupted, with LF replaced by CR")
## Not a version 2 or higher magic number, so try the pre-R-1.4.0 code
warning(sprintf("file %s has magic number '%s'\n",
sQuote(basename(file)),
gsub("[\n\r]*", "", magic)),
" ",
"Use of save versions prior to 2 is deprecated",
domain = NA, call. = FALSE)
return(.Internal(load(file, envir)))
}
} else if (inherits(file, "connection")) {
con <- if(inherits(file, "gzfile") || inherits(file, "gzcon")) file
else gzcon(file)
} else stop("bad 'file' argument")
if (verbose)
cat("Loading objects:\n")
.Internal(loadFromConn2(con, envir, verbose))
}
save <- function(..., list = character(),
file = stop("'file' must be specified"),
ascii = FALSE, version = NULL, envir = parent.frame(),
compress = isTRUE(!ascii), compression_level,
eval.promises = TRUE, precheck = TRUE)
{
opts <- getOption("save.defaults")
if (missing(compress) && ! is.null(opts$compress))
compress <- opts$compress
if (missing(compression_level) && ! is.null(opts$compression_level))
compression_level <- opts$compression_level
if (missing(ascii) && ! is.null(opts$ascii))
ascii <- opts$ascii
if (missing(version)) version <- opts$version
if (!is.null(version) && version < 2)
warning("Use of save versions prior to 2 is deprecated", domain = NA)
names <- as.character(substitute(list(...)))[-1L]
if(missing(list) && !length(names))
warning("nothing specified to be save()d")
list <- c(list, names)
if (!is.null(version) && version == 1)
.Internal(save(list, file, ascii, version, envir, eval.promises))
else {
if (precheck) {
## check for existence of objects before opening connection
## (and e.g. clobering file)
ok <- vapply(list, exists, NA, envir=envir)
if(!all(ok)) {
n <- sum(!ok)
stop(sprintf(ngettext(n,
"object %s not found",
"objects %s not found"
),
paste(sQuote(list[!ok]), collapse = ", ")
), domain = NA)
}
}
if (is.character(file)) {
if(!nzchar(file)) stop("'file' must be non-empty string")
if(!is.character(compress)) {
if(!is.logical(compress))
stop("'compress' must be logical or character")
compress <- if(compress) "gzip" else "no compression"
}
con <- switch(compress,
"bzip2" = {
if (!missing(compression_level))
bzfile(file, "wb", compression = compression_level)
else bzfile(file, "wb")
}, "xz" = {
if (!missing(compression_level))
xzfile(file, "wb", compression = compression_level)
else xzfile(file, "wb", compression = 9)
}, "gzip" = {
if (!missing(compression_level))
gzfile(file, "wb", compression = compression_level)
else gzfile(file, "wb")
},
"no compression" = file(file, "wb"),
## otherwise:
stop(gettextf("'compress = \"%s\"' is invalid", compress)))
on.exit(close(con))
}
else if (inherits(file, "connection"))
con <- file
else stop("bad file argument")
if(isOpen(con) && !ascii && summary(con)$text != "binary")
stop("can only save to a binary connection")
.Internal(saveToConn(list, con, ascii, version, envir, eval.promises))
}
}
save.image <- function (file = ".RData", version = NULL, ascii = FALSE,
compress = !ascii, safe = TRUE)
{
if (! is.character(file) || file == "")
stop("'file' must be non-empty string")
opts <- getOption("save.image.defaults")
if(is.null(opts)) opts <- getOption("save.defaults")
if (missing(safe) && ! is.null(opts$safe))
safe <- opts$safe
if (missing(ascii) && ! is.null(opts$ascii))
ascii <- opts$ascii
if (missing(compress) && ! is.null(opts$compress))
compress <- opts$compress
if (missing(version)) version <- opts$version
if (safe) {
## find a temporary file name in the same directory so we can
## rename it to the final output file on success
outfile <- paste0(file, "Tmp")
i <- 0
while (file.exists(outfile)) {
i <- i + 1
outfile <- paste0(file, "Tmp", i)
}
}
else outfile <- file
on.exit(file.remove(outfile))
save(list = names(.GlobalEnv), file = outfile,
version = version, ascii = ascii, compress = compress,
envir = .GlobalEnv, precheck = FALSE)
if (safe)
if (! file.rename(outfile, file)) {
on.exit()
stop(gettextf("image could not be renamed and is left in %s",
outfile), domain = NA)
}
on.exit()
}
sys.load.image <- function(name, quiet)
{
if (file.exists(name)) {
load(name, envir = .GlobalEnv)
if (! quiet)
message("[Previously saved workspace restored]", "\n")
}
}
sys.save.image <- function(name)
{
## Ensure that there is a reasonable chance that we can open a
## connection.
closeAllConnections()
save.image(name)
}
findPackageEnv <- function(info)
{
if(info %in% search()) return(as.environment(info))
message(gettextf("Attempting to load the environment %s", sQuote(info)),
domain = NA)
if(require(substr(info, 9L, 1000L), character.only = TRUE, quietly = TRUE))
return(as.environment(info))
message("Specified environment not found: using '.GlobalEnv' instead")
.GlobalEnv
}