Skip to content

[patch] giving library() a 'version' argument

3 messages · Roebuck,Paul L, Martin Maechler, Ken Williams

#
On 4/12/12 1:56 PM, "Ken Williams" <Ken.Williams at windlogics.com> wrote:

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

        
> 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).
#