[R-gregmisc-users] SF.net SVN: r-gregmisc:[1607] trunk
Brought to you by:
warnes
From: <wa...@us...> - 2012-09-13 23:36:16
|
Revision: 1607 http://r-gregmisc.svn.sourceforge.net/r-gregmisc/?rev=1607&view=rev Author: warnes Date: 2012-09-13 23:36:10 +0000 (Thu, 13 Sep 2012) Log Message: ----------- Create package containing namespace management functions (currently) missing from R base Added Paths: ----------- trunk/namespace/ trunk/namespace/DESCRIPTION trunk/namespace/NAMESPACE trunk/namespace/R/ trunk/namespace/R/namespace.R trunk/namespace/man/ trunk/namespace/man/namespace-package.Rd trunk/namespace/man/namespace.Rd trunk/namespace/src/ trunk/namespace/src/namespace.c trunk/namespace/src/symbols.rds Added: trunk/namespace/DESCRIPTION =================================================================== --- trunk/namespace/DESCRIPTION (rev 0) +++ trunk/namespace/DESCRIPTION 2012-09-13 23:36:10 UTC (rev 1607) @@ -0,0 +1,9 @@ +Package: namespace +Type: Package +Title: Provide namespace managment functions not (yet) present in base R +Version: 1.0 +Date: 2012-09-13 +Author: Winston Chang, Daniel Adler, Hadley Wickham, Gregory R. Warnes, some code from the R 'base' package. +Maintainer: Gregory R. Warnes <gr...@wa...> +Description: More about what it does (maybe more than one line) +License: GPL-2 Added: trunk/namespace/NAMESPACE =================================================================== --- trunk/namespace/NAMESPACE (rev 0) +++ trunk/namespace/NAMESPACE 2012-09-13 23:36:10 UTC (rev 1607) @@ -0,0 +1,7 @@ +useDynLib(namespace) + +export(getRegisteredNamespace) +export(makeNamespace) +export(registerNamespace) +export(unregisterNamespace) + Added: trunk/namespace/R/namespace.R =================================================================== --- trunk/namespace/R/namespace.R (rev 0) +++ trunk/namespace/R/namespace.R 2012-09-13 23:36:10 UTC (rev 1607) @@ -0,0 +1,85 @@ +# Returns the namespace registry +#' @useDynLib devtools nsreg +.getNameSpaceRegistry <- function() { + .Call("nsreg", "namespace") +} + +# Register a namespace +registerNamespace <- function(name = NULL, env = NULL) { + # Be careful about what we allow + if (!is.character(name) || name == "" || length(name) != 1) + stop("'name' must be a non-empty character string.") + + if (!is.environment(env)) + stop("'env' must be an environment.") + + if (name %in% loadedNamespaces()) + stop("Namespace ", name, " is already registered.") + + # Add the environment to the registry + nsr <- .getNameSpaceRegistry() + nsr[[name]] <- env + + env +} + + +# Unregister a namespace - should be used only if unloadNamespace() +# fails for some reason +unregisterNamespace <- function(name = NULL) { + # Be careful about what we allow + if (!is.character(name) || name == "" || length(name) != 1) + stop("'name' must be a non-empty character string.") + + if (!(name %in% loadedNamespaces())) + stop(name, " is not a registered namespace.") + + # Remove the item from the registry + rm(name, .getNameSpaceRegistry()) + invisible() +} + +# This is similar to getNamespace(), except that getNamespace will load +# the namespace if it's not already loaded. This function will not. +# In R 2.16, a function called .getNamespace() will have the same effect +# and this will no longer be necessary. +if(exists(".getNamespace", where="package:base", mode="function")) { + getRegisteredNamespace <- function(name) base::.getNamespace(name) +} else { + getRegisteredNamespace <- function(name) + { + ## Sometimes we'll be passed something like as.name(name), so make sure + ## it's a string for comparison + if (!(as.character(name) %in% loadedNamespaces())) + return(NULL) + else + return(getNamespace(name)) + } +} + +## Copy of function defined inside of base::loadNamespace +makeNamespace <- function(name, version = NULL, lib = NULL) { + impenv <- new.env(parent = .BaseNamespaceEnv, hash = TRUE) + attr(impenv, "name") <- paste("imports", name, sep=":") + env <- new.env(parent = impenv, hash = TRUE) + name <- as.character(as.name(name)) + version <- as.character(version) + info <- new.env(hash = TRUE, parent = baseenv()) + assign(".__NAMESPACE__.", info, envir = env) + assign("spec", c(name = name,version = version), envir = info) + setNamespaceInfo(env, "exports", new.env(hash = TRUE, parent = baseenv())) + dimpenv <- new.env(parent = baseenv(), hash = TRUE) + attr(dimpenv, "name") <- paste("lazydata", name, sep=":") + setNamespaceInfo(env, "lazydata", dimpenv) + setNamespaceInfo(env, "imports", list("base" = TRUE)) + ## this should be an absolute path + setNamespaceInfo(env, "path", + normalizePath(file.path(lib, name), "/", TRUE)) + setNamespaceInfo(env, "dynlibs", NULL) + setNamespaceInfo(env, "S3methods", matrix(NA_character_, 0L, 3L)) + assign(".__S3MethodsTable__.", + new.env(hash = TRUE, parent = baseenv()), + envir = env) + registerNamespace(name, env) + env +} Added: trunk/namespace/man/namespace-package.Rd =================================================================== --- trunk/namespace/man/namespace-package.Rd (rev 0) +++ trunk/namespace/man/namespace-package.Rd 2012-09-13 23:36:10 UTC (rev 1607) @@ -0,0 +1,29 @@ +\name{namespace-package} +\alias{namespace-package} +\alias{namespace} +\docType{package} +\title{Namespace managment functions} +\description{ +This package provides user-level functions to manage namespaces not +(yet) available in base R. +} +\details{ +\tabular{ll}{ +Package: \tab namespace\cr +Type: \tab Package\cr +Version: \tab 1.0\cr +Date: \tab 2012-09-13\cr +License: \tab GPL-2\cr +} +} +\author{ +Winston Chang, Daniel Adler, Hadley Wickham, Gregory R. Warnes, some +code from the R 'base' package. + +Maintainer: Gregory R. Warnes <gr...@wa...> +} +\keyword{ package } +\keyword{ programming } +\seealso{ + \code{\link[base]{ns-internal}} +} Added: trunk/namespace/man/namespace.Rd =================================================================== --- trunk/namespace/man/namespace.Rd (rev 0) +++ trunk/namespace/man/namespace.Rd 2012-09-13 23:36:10 UTC (rev 1607) @@ -0,0 +1,59 @@ +\name{namespace} +\alias{registerNamespace} +\alias{unregisterNamespace} +\alias{makeNamespace} +\alias{getRegisteredNamespace} +\title{ +Functions to obtain, create, register, and unregister namespaces +} +\description{ +User-level functions to manage namespaces not (yet) available in base R. +} +\usage{ +registerNamespace(name=NULL, env=NULL) +unregisterNamespace(name=NULL) +makeNamespace(name, version=NULL, lib=NULL) +getRegisteredNamespace(name) +} +\arguments{ + \item{name}{string} + \item{env}{namespace environment} + \item{version}{version} + \item{lib}{string naming the package/namespace to load} +} +\details{ + \code{registerNamespace} creates a new namespace entry with the + provided environment. + + \code{unregisterNamespace} removes an existing namespace. + + \code{makeNamespace} creates a new namespace. + + \code{getRegisteredNamespace} returns the specified namespace, or NULL if + it is not loaded. (In R 2.16.0 this is just a wrapper for \code{base::.getNamespace}). +} +\references{ + R-devel mailing list topic "[Rd] makeNamespace and rdyncall", + Dec. 2011: + \url{https://stat.ethz.ch/pipermail/r-devel/2011-December/062838.html} + + R-devel mailing list topic "[Rd] rdyncall fears removal from CRAN", + Aug 2012: + \url{https://stat.ethz.ch/pipermail/r-devel/2012-August/064659.html} +} +\author{ + Winston Chang, Daniel Adler, Hadley Wickham, Gregory R. Warnes, and + code from the R 'base' package. +} +\note{ + These functions provide support for namespaces needed by some + low-level packages (e.g. \code{devtools} and \code{rdynload}) + requested by their respective authors. +} +\seealso{ + \code{\link[base]{ns-internal}} +} +\examples{ +## Examples needed! ## +} +\keyword{programming} Added: trunk/namespace/src/namespace.c =================================================================== --- trunk/namespace/src/namespace.c (rev 0) +++ trunk/namespace/src/namespace.c 2012-09-13 23:36:10 UTC (rev 1607) @@ -0,0 +1,6 @@ +#include <R.h> +#include <Rdefines.h> + +SEXP nsreg() { + return R_NamespaceRegistry; +} Added: trunk/namespace/src/symbols.rds =================================================================== (Binary files differ) Property changes on: trunk/namespace/src/symbols.rds ___________________________________________________________________ Added: svn:mime-type + application/octet-stream This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |