From maechler at stat.math.ethz.ch  Fri Apr 13 10:52:30 2012
From: maechler at stat.math.ethz.ch (Martin Maechler)
Date: Fri, 13 Apr 2012 10:52:30 +0200
Subject: [Rd] [patch] giving library() a 'version' argument
In-Reply-To: <CBAC9489.2C4E5%proebuck@mdanderson.org>
References: <21A5E1E970CD46459ECBE86D6CC4B28C667AAA8C@spexch01.WindLogics.local>
	<CBAC9489.2C4E5%proebuck@mdanderson.org>
Message-ID: <20359.59726.5194.479618@stat.math.ethz.ch>

>>>>> Roebuck,Paul L <proebuck at mdanderson.org>
>>>>>     on Thu, 12 Apr 2012 14:17:45 -0500 writes:

    > On 4/12/12 1:56 PM, "Ken Williams" <Ken.Williams at windlogics.com> wrote:
    >> On April 12, 2012 1:48 PM, Paul Roebuck wrote:
    >> 
    >>> Not sure I follow you here. The packageVersion() method is
    >>> essentially a shortcut to packageDescription("MyPackage")$Version. I
    >>> generally avoid doing package upgrades in my scripts so the loaded
    >>> package IS the installed package (even when playing .libPaths()
    >>> tricks).
    >> 
    >> The scenario is:
    >> 
    >> library(PackageX) # Quietly loads version 1 of PackageY
    >> 
    >> # Try to load a specific version of PackageY
    >> .libPaths('directory/containing/PackageY/version-2') library(PackageY)
    >> # actually does nothing, since it's already loaded
    >> stopifnot(packageVersion('PackageY') >= 2) # ??
    >> 
    >> 
    >> The intention of the stopifnot() expression is to make sure version 2
    >> is loaded.
    >> 
    >> If packageVersion() goes & looks for PackageY in .libPaths() even when
    >> the package is already loaded, it will provide the wrong answer -
    >> because it will find version 2, but version 1 is what's loaded.
    >> However, if packageVersion() checks the version of what's already
    >> loaded, then it would do the right thing here.
    >> 
    >> I don't think the docs for packageDescription() clarify what happens
    >> in this case, but I could be missing it.

    > If you're going to "play" with .libPaths() like that,
    > it should be done prior to ANY libraries being loaded.

    > Going about the style you do below, you'd need to parse
    > sessionInfo() instead. packageVersion() as well as
    > packageDescription() give you the information based on
    > the first package in the path with the same name. If you
    > dynamically change the path, the returned information
    > could be different...

Aa..h, now we are getting into a more interesting issue:

Fortunately, what you say above has *not* been true for a while
(I think, but am not sure, that I was involved in fixing it..):

Indeed nowadays,  packageDescription()  *)  *does*
use the correct package version, by inspecting the "path"
attribute of the package, in the same way as
	  searchpaths()

does --- a function, BTW, that I think should be known and used
more than I think it is.

*) packageVersion() is built on packageDescription() and hence
 is also correct accordingly.

--
Martin Maechler, ETH Zurich (and R core).



[Rd] [patch] giving library() a 'version' argument
Martin Maechler