# File src/library/base/R/autoload.R # Part of the R package, https://www.R-project.org # # Copyright (C) 1995-2012 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/ autoload <- function(name, package, reset=FALSE, ...) { if (!reset && exists(name, envir = .GlobalEnv, inherits = FALSE)) stop("an object with that name already exists") m <- match.call() m[[1L]] <- as.name("list") newcall <- eval(m, parent.frame()) newcall <- as.call(c(as.name("autoloader"), newcall)) newcall$reset <- NULL if (is.na(match(package, .Autoloaded))) assign(".Autoloaded", c(package, .Autoloaded), envir =.AutoloadEnv) do.call("delayedAssign", list(name, newcall, .GlobalEnv, .AutoloadEnv)) ## no longer return the result, which is a promise invisible() } autoloader <- function (name, package, ...) { name <- paste0(name, "") rm(list = name, envir = .AutoloadEnv, inherits = FALSE) m <- match.call() m$name <- NULL m[[1L]] <- as.name("library") ## load the package eval(m, .GlobalEnv) ## reset the autoloader autoload(name, package, reset = TRUE, ...) ## reevaluate the object where <- match(paste0("package:", package), search()) if (exists(name, where = where, inherits = FALSE)) eval(as.name(name), as.environment(where)) else stop(gettextf("autoloader did not find '%s' in '%s'", name, package), domain = NA) }