Rev 75606 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
# File src/library/methods/R/packageName.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/## utilities to manage package namesgetPackageName <- function(where = topenv(parent.frame()), create = TRUE) {env <- as.environment(where)pkg <- get0(".packageName", env, inherits = FALSE)saved <- !is.null(pkg)if (saved) {return(pkg)}else {pkg <- if(identical(where, 1) || identical(env, topenv(parent.frame())))Sys.getenv("R_PACKAGE_NAME")else ""}envName <- environmentName(env)if(nzchar(envName) && regexpr("package:", envName, fixed = TRUE) == 1L)pkg <- .rmpkg(envName)if(!nzchar(pkg)) { ## is still ""if(identical(env, .GlobalEnv))pkg <- ".GlobalEnv"else if(identical(env, .BaseNamespaceEnv))pkg <- "base"else {if(is.numeric(where))pkg <- search()[[where]]else if(is.environment(where)) {for(db in search())if(identical(as.environment(db), where)) {pkg <- db; break}}else if(nzchar(envName))pkg <- envNameelsepkg <- as.character(where)pkg <- .rmpkg(pkg)}# Problem: the library() function should now be putting .packageName in package environments# but namespace makes them invisible from outside.## save the package name, but .GlobalEnv is not a package name,## and package base doesn't have a .packageName (yet?)# if(!(identical(pkg, ".GlobalEnv") || identical(pkg, "base")) ) {# setPackageName(pkg, env)# ## packages OUGHT# ## to be self-identifying# warning("The package name \"", pkg, "\" was inferred, but not found in that package")# }}if (!nzchar(pkg)) {top <- topenv(env)if (!identical(top, env)) {pkg <- getPackageName(top, create=create)}}if(!nzchar(pkg) && create) {pkg <- as.character(Sys.time())warning(gettextf("Created a package name, %s, when none found",sQuote(pkg)),domain = NA)if(!saved && !environmentIsLocked(env))setPackageName(pkg, env)}pkg}setPackageName <- function(pkg, env)assign(".packageName", pkg, envir = env)##FIXME: rather than an attribute, the className should have a formal class## (but there may be bootstrap problems)packageSlot <- function(object)attr(object, "package")`packageSlot<-` <- function(object, value) {attr(object, "package") <- valueobject}