[R] Set values in namespaces

Prof Brian Ripley ripley at stats.ox.ac.uk
Mon Jan 5 14:40:58 CET 2004

On Mon, 5 Jan 2004, Thomas Stabla wrote:

> I want to use global variables in a package which is using a namespace.
> But I don`t know how to change the values of the global variables.
> I know how to get the value of the variables, e.g.
> > base::pi
> [1] 3.141593
> but following code doesn`t work
> > base::pi <- 3.14
> Error: Object "base" not found

Base is a special case, and

assign("pi", 3.14, envir=NULL)

will do this (although please don't).

All other namespaces are sealed, so you will get something like

> library(MASS)
> assign("lda", pi, pos=2)
Error in assign("lda", pi, pos = 2) : can't change value of a locked binding

Now, that attempts to change the export, and not the value in the
namespace, so there is a question of which you want and why you want to
change it.  (Changing the value in the namespace does not change the
export, which is a copy, but as _both_ the namespace and exports
environments are sealed, this would not matter much.)

There are ways around this and if you peruse the R sources you will find 
them.  For example, grid sets up an environment in its namespace for its 
global variables, and in R-devel there is assignInNamespace().

Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595

More information about the R-help mailing list