[Rd] function remains loaded in the search space after detaching the package
Joris Meys
jorismeys at gmail.com
Fri Feb 24 13:25:53 CET 2012
Indeed, when trying :
> detach('package:gdata',unload=TRUE)
> print(object.size(iris),units='Kb')
[1] 6424
However, when I do :
> unloadNamespace('gdata')
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 380471 10.2 667722 17.9 597831 16.0
Vcells 353363 2.7 905753 7.0 902804 6.9
The function used is still print.object_size from gdata
> print(object.size(iris),units='Kb')
[1] 6424
But it can't be found any more...
> 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
... (here is indeed the code of the original print.object_size)
This is not some kind of behaviour one would expect. I have no clue
how to solve this, but I believe it's safe to say that there's room
for improvement somewhere to avoid calling a function that's
apparently not in the search space. Any other ideas?
Cheers
Joris
On Fri, Feb 24, 2012 at 1:08 PM, Prof Brian Ripley
<ripley at stats.ox.ac.uk> wrote:
> 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
--
Joris Meys
Statistical consultant
Ghent University
Faculty of Bioscience Engineering
Department of Mathematical Modelling, Statistics and Bio-Informatics
tel : +32 9 264 59 87
Joris.Meys at Ugent.be
-------------------------------
Disclaimer : http://helpdesk.ugent.be/e-maildisclaimer.php
More information about the R-devel
mailing list