[Rd] function remains loaded in the search space after detaching the package

Prof Brian Ripley ripley at stats.ox.ac.uk
Fri Feb 24 13:08:13 CET 2012


On 24/02/2012 11:20, Martin Maechler wrote:
>>>>>> Joris Meys<jorismeys at gmail.com>
>>>>>>      on Fri, 24 Feb 2012 11:24:35 +0100 writes:
>
>      >  I ran into some very irritating behaviour I don't
>      >  understand.  Let me illustrate with the package gdata()
>      >  and the function print.object_size() :
>
>      >>  print(object.size(iris),units='Kb')
>      >  6.3 Kb
>      >>  getAnywhere(print.object_size)
>      >  A single object matching ‘print.object_size’ was found It
>      >  was found in the following places registered S3 method for
>      >  print from namespace utils namespace:utils with value ...
>
>      >  All is well. So now I load gdata
>
>      >>  require(gdata)
>      >  Loading required package: gdata ...  The following
>      >  object(s) are masked from ‘package:utils’:
>
>      >      object.size
>
>      >  OK, this is what I would expect:
>
>      >>  print(object.size(iris),units='Kb')
>      >  [1] 6424
>      >>  getAnywhere(print.object_size)
>      >  2 differing objects matching ‘print.object_size’ were
>      >  found in the following places registered S3 method for
>      >  print from namespace utils namespace:gdata namespace:utils
>      >  Use [] to view one of them
>
>      >  Now I detach gdata again
>
>      >>  detach(package:gdata)
>
>      >  But the function print.object_size is still the default
>      >  for object_size objects!
>
>      >>  print(object.size(iris),units='Kb')
>      >  [1] 6424
>
>      >  And it can still be found as well:
>
>      >>  getAnywhere(print.object_size)
>      >  2 differing objects matching ‘print.object_size’ were
>      >  found in the following places registered S3 method for
>      >  print from namespace utils namespace:gdata namespace:utils
>      >  Use [] to view one of them
>
>      >  Am I missing something?
>
> Yes:  the argument  'unload'   of detach().
>
> In general: Now that every package has a namespace,
> you (and others) should learn the difference between
> attaching and loading - and hence  detach()ing and unloading
> a package with its namespace.
>
>   ?detach
>   ?library
>
> etc should give a good start.

A very good point, but actually there is more to this one.  'gdata' 
registers an S3 method which overwrites the one from utils.  Unloading a 
namespace does not unregister its methods (and registration has no 
stack, so there is no way R knows what was there before).

-- 
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-devel mailing list