From ripley at stats.ox.ac.uk  Sat Apr 14 09:07:46 2007
From: ripley at stats.ox.ac.uk (Prof Brian Ripley)
Date: Sat, 14 Apr 2007 08:07:46 +0100 (BST)
Subject: [Rd] how to control which version of a package library()
	installs?
In-Reply-To: <462004BD.60702@acm.org>
References: <461FED8C.2040603@acm.org>
	<Pine.LNX.4.64.0704132204150.18247@gannet.stats.ox.ac.uk>
	<461FFA29.8040401@acm.org>
	<Pine.LNX.4.64.0704132252050.17244@auk.stats>
	<462004BD.60702@acm.org>
Message-ID: <Pine.LNX.4.64.0704140744510.23679@auk.stats>

On Fri, 13 Apr 2007, Tony Plate wrote:

> Prof Brian Ripley wrote:
>> On Fri, 13 Apr 2007, Tony Plate wrote:
>>
>>> Thank you!  I had not realized that the name space remained loaded.
>>> When I did unloadNamespace("ExamplePackage") after the detach() I got
>>> what I wanted.

Seth Falcon mentioned detach(unload=TRUE) (needs R 2.5.x, I think), but 
unloadNamespace() does detach() if needed.

>>> Maybe the following sentence might be a useful addition to the
>>> "Details" or "Notes" section of the help page for detach?:
>>>  To detach() and reattach() a package you will probably need to use
>>> unloadNamespace("somePackage") after detach("package:somePackage")
>>
>> We should try to explain this, but there is another level of complexity.
>> If a package has compiled code, unloading the namespace is unlikely to
>> unload the DLL (it would need to be done explicitly in .onUnload).
>> And even then, as I understand it there are OSes on which you cannot
>> really unload DLLs, and certainly cannot load another DLL of the same
>> name into the process: you get the previously loaded one.
>>
>> Given all the issues, I always work on the assumption that re-loading a
>> package into a R session is not going to do what I intend.
>
> Ok, but will it work for packages with pure R code? (disregarding things
> a package might do in its load hooks).

Not necessarily, because registered S3 methods are not removed.
Also, you cannot unload a name space from which there are imports in use.

Also, exported S4 methods from a name space are cached, so the S4 methods 
cache needs to be rebuilt (which would happen if the new version of the 
package had S4 methods, and is done by detach(unload=TRUE)).  However, the 
S4 story is worse: setting S4 generics in a package on an existing 
function captures the definition at package install time, so changing the 
version of one package may require others to be re-installed.  (That is 
not hypothetical: it has happened in R-devel several times in the last two 
weeks.)

I won't even start to mention versioned installs ....

-- 
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



[Rd] how to control which version of a package library() installs?
Prof Brian Ripley