Skip to content
Back to formatted view

Raw Message

Message-ID: <Pine.LNX.4.61.0505090527030.28603@gannet.stats>
Date: 2005-05-09T06:39:27Z
From: Brian Ripley
Subject: How to understand packages, namespaces, environments
In-Reply-To: <4D99275E380CA94F998977EDACE548DC1AE6B0@extas2-hba.tas.csiro.au>

On Mon, 9 May 2005 Mark.Bravington@csiro.au wrote:

> [Alexander Stoddard]
>> Subject: Re: [Rd] How to understand packages, namespaces, environments
>>
>>>
>>> Does saying the following load package 'foo' into its own
>> environment ?
>>> > library(foo)
>>
> [Duncan Murdoch]
>> This loads some of the (name, object) pairs from the package into two
>> environments:  the public one the user can see, and the
>> namespace one that the code in the package can see.  They're
>> related, you don't get two copies of the objects.
>
> That's interesting-- I thought there really were two copies. In my debug
> package, I've taken the approach of changing both copies. Is one of the
> copies a "master", and the other one something like an activeBinding?
> Can I get away with changing just one of them?

Duncan is wrong here (or misquoted).  Loading a package with a namespace 
loads all the objects in the package (possibly as promises) into the 
namespace environment.  Then some are copied (using assign) to the package 
environment.  Since like most R copies this is really copy-on-change you 
do not get a real copy (nor force a promise) until use.

See ?fixInNamespace for explicit statements about this.  There can be more 
than two copies, since importing also `copies', as does S3 method 
registration (the latter does sometimes force promises).

-- 
Brian D. Ripley,                  ripley@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