From simon.urbanek at r-project.org  Wed Jan 14 16:37:42 2009
From: simon.urbanek at r-project.org (Simon Urbanek)
Date: Wed, 14 Jan 2009 10:37:42 -0500
Subject: [Rd] particulars of importing/loading libraries
In-Reply-To: <1A68FCB28DE72F4BA3B967E6506CCE43047DF588@mildnpexmb01.maninvestments.ad.man.com>
References: <1A68FCB28DE72F4BA3B967E6506CCE43047DF583@mildnpexmb01.maninvestments.ad.man.com>
	<E66844FE-E31E-45F4-8753-72445204E7A6@r-project.org>
	<1A68FCB28DE72F4BA3B967E6506CCE43047DF588@mildnpexmb01.maninvestments.ad.man.com>
Message-ID: <17552B71-88D9-456D-84A4-EC9ACC6744A2@r-project.org>


On Jan 14, 2009, at 4:24 , Sklyar, Oleg (London) wrote:

> Sorry Simon, you are right. I tried to recreate a problem that I had  
> with other packages where the packages were added to Depends but  
> made a mistake. However the problem remains if I do the following.
>
> Added: pack1 to Depends of pack2. Now I create pack3 with the  
> following contents: it does not import pack1 directly, nor depends  
> on it. It rather imports pack2 and depends on pack2. I then expect  
> the functionality of pack1 to be available still if I only load pack3.


That is semantically not a reasonable requirement. pack3 cannot (and  
should not) assume anything about the internals of pack2. If it needs  
a function from pack1, it has to import it from pack1. If pack2 re- 
exported as.POSIXct then that would make it part of pack2's interface  
and then you're free to just depend on pack2.

Cheers,
S



> But I
> now get errors with pack3 calling the function from pack1. Does this
> mean I need to import and depend on pack1 and methods explicitly in
> pack3. I.e. do I have to import and depend on ALL the packages that  
> may
> be in use, even if they are imported by other that I depend on and
> import:
>
> ---- pack3: DESCRIPTION -----
>
> Package: pack3
> Version: 0.0.1
> Date: 12 Jan 2009
> Title: pack1 to test S3/S4 methods compatibility
> Author:  Oleg Sklyar
> Depends: R (>= 2.7.1), pack2
> Maintainer: Oleg Sklyar <osklyar at maninvestments.com>
> Description: pack3
> LazyLoad: yes
> License: Proprietary
> URL: http://www.maninvestments.com
> LazyLoad: no
>
> ---- pack3: NAMESPACE ------
> import(pack2)
> exportPattern("^[^\\.]")
>
> ---- pack3: posix.R ------
> testPosix2 = function() {
>    z = as.POSIXct(testPosixVal)
>    print(z)
>    print(class(z))
>    z
> }
>
> Note, that the above function is the same as in pack2, just a  
> different
> name.
>
>
> *** R 2.9.0 (svn -r 46585) [/share/research/R-devel/20081002/lib64/R]
> ***
>> library(pack3)
> Loading required package: pack2
> Loading required package: pack1
>> as.POSIXct(pack1::testPosixVal)
> [1] "2009-01-13 15:29:50 UTC"
>> testPosxi() ## called from pack2
> [1] "2009-01-13 15:29:50 UTC"
> [1] "POSIXt"  "POSIXct"
> [1] "2009-01-13 15:29:50 UTC"
>> testPosix2() ## called from pack3
> Error in as.POSIXct.default(testPosixVal) :
>  do not know how to convert 'testPosixVal' to class "POSIXlt"
>
>
>
>
> Dr Oleg Sklyar
> Research Technologist
> AHL / Man Investments Ltd
> +44 (0)20 7144 3107
> osklyar at maninvestments.com
>
>> -----Original Message-----
>> From: Simon Urbanek [mailto:simon.urbanek at r-project.org]
>> Sent: 14 January 2009 01:51
>> To: Sklyar, Oleg (London)
>> Cc: r-devel at r-project.org
>> Subject: Re: [Rd] particulars of importing/loading libraries
>>
>> Oleg,
>>
>> On Jan 13, 2009, at 11:00 , Sklyar, Oleg (London) wrote:
>>
>>> Dear List:
>>>
>>> Sorry for posting maybe a trivial question, but I have a basic
>>> understanding problem. If I have say pack1 and pack2, two R
>> packages,
>>> and pack2 depends on and imports pack1 fully (as in the
>> code below),
>>> is
>>> there a way to make all the functionality of pack1 available for the
>>> global and other environments (not only for the functions
>> called from
>>> withing pack2) by loading pack2 only? I thought if pack2
>> depends on
>>> and
>>> imports pack1 and essentially reexports everything, one
>> should get the
>>> full functionality simply by loading pack2. This does not
>> seem to be
>>> the
>>> case or I am missing something trivial in my NAMESPACE/DESCRIPTION
>>> files?
>>>
>>> If this is documented in Writing R Extensions, I would be thankful
>>> for a
>>> page number and maybe a quick fix in my example below as so
>> far I have
>>> not been able to find a clear explanation.
>>>
>>> The problem can be illustrated by the following simple
>> example (this
>>> is
>>> a simple code for 2 packages, pack1 and pack2; plus an example).
>>>
>>
>> if you bothered to use R CMD check you would find your bug right  
>> away:
>> * checking package dependencies ... ERROR
>> Namespace dependencies not required:
>>   pack1
>>
>> You simply forgot to add pack1 to the Depends: line - that's
>> all. Once
>> you fix that, you'll see what happens:
>>
>>> library(pack2)
>> Loading required package: pack1
>>> as.POSIXct(pack1::testPosixVal)
>> [1] "2009-01-14 01:38:08 UTC"
>>
>> Cheers,
>> S
>>
>>
>>> Thank you for your replies.
>>>
>>> Dr Oleg Sklyar
>>> Research Technologist
>>> AHL / Man Investments Ltd
>>> +44 (0)20 7144 3107
>>> osklyar at maninvestments.com
>>>
>>> --- pack1: DESCRIPTION ------
>>> Package: pack1
>>> Version: 0.0.1
>>> Date: 12 Jan 2009
>>> Title: pack1 to test S3/S4 methods compatibility
>>> Author:  Oleg Sklyar
>>> Depends: R (>= 2.7.1), methods
>>> Maintainer: Oleg Sklyar <osklyar at maninvestments.com>
>>> Description: pack1
>>> LazyLoad: yes
>>> License: Proprietary
>>> URL: http://www.maninvestments.com
>>> LazyLoad: no
>>>
>>> --- pack1: NAMESPACE ------
>>> import(methods)
>>> exportPattern("^[^\\.]")
>>> exportClasses(posixTime)
>>> exportMethods(as.POSIXct)
>>>
>>> --- pack1: posix.R ------
>>> setClass("posixTime", "numeric")
>>>
>>> setGeneric("as.POSIXct")
>>> setMethod("as.POSIXct", signature(x="posixTime"),
>>>   function(x, tz) {
>>>       z = x at .Data
>>>       attr(z,"class") = c("POSIXt", "POSIXct")
>>>       attr(z,"tzone") = "UTC"
>>>       z
>>>   }
>>> )
>>>
>>> testPosixVal = new("posixTime", as.numeric(Sys.time()))
>>>
>>> --- pack2: DESCRIPTION
>>> Package: pack2
>>> Version: 0.0.1
>>> Date: 12 Jan 2009
>>> Title: pack2 to test S3/S4 methods compatibility
>>> Author:  Oleg Sklyar
>>> Depends: R (>= 2.7.1), methods
>>> Maintainer: Oleg Sklyar <osklyar at maninvestments.com>
>>> Description: pack2
>>> LazyLoad: yes
>>> License: Proprietary
>>> URL: http://www.maninvestments.com
>>> LazyLoad: no
>>>
>>> --- pack2: NAMESPACE ------
>>> import(pack1)
>>> exportPattern("^[^\\.]")
>>>
>>> --- pack2: posix.R ------
>>> testPosix = function() {
>>>   z = as.POSIXct(testPosixVal)
>>>   print(z)
>>>   print(class(z))
>>>   z
>>> }
>>>
>>> ------ test code to run from global env, showing problems -------
>>> require(pack2)
>>>
>>> ## use as.POSIXct imported into pack2 from pack1 to do the
>>> conversion in
>>> the fun
>>> testPosix()
>>> #~ [1] "2009-01-13 15:29:50 UTC"
>>> #~ [1] "POSIXt"  "POSIXct"
>>> #~ [1] "2009-01-13 15:29:50 UTC"
>>>
>>> ## now try using it directly from the global env (pack1 was not
>>> explicitly loaded)
>>> as.POSIXct(pack1::testPosixVal)
>>> #~ Error in as.POSIXct.default(pack1::testPosixVal) :
>>> #~  do not know how to convert 'pack1::testPosixVal' to class
>>> "POSIXlt"
>>>
>>> ## now require pack1 explicitly and try again
>>> require(pack1)
>>> as.POSIXct(pack1::testPosixVal)
>>> #~ [1] "2009-01-13 15:29:50 UTC"
>>>
>>>
>>>
>> **********************************************************************
>>> Please consider the environment before printing this email or its
>>> attachments.
>>> The contents of this email are for the named addressees
>> ...{{dropped:
>>> 19}}
>>>
>>> ______________________________________________
>>> R-devel at r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>>
>>>
>>
>>
>
> **********************************************************************
> Please consider the environment before printing this email or its  
> attachments.
> The contents of this email are for the named addressees only.  It  
> contains information which may be confidential and privileged.  If  
> you are not the intended recipient, please notify the sender  
> immediately, destroy this email and any attachments and do not  
> otherwise disclose or use them. Email transmission is not a secure  
> method of communication and Man Investments cannot accept  
> responsibility for the completeness or accuracy of this email or any  
> attachments. Whilst Man Investments makes every effort to keep its  
> network free from viruses, it does not accept responsibility for any  
> computer virus which might be transferred by way of this email or  
> any attachments. This email does not constitute a request, offer,  
> recommendation or solicitation of any kind to buy, subscribe, sell  
> or redeem any investment instruments or to perform other such  
> transactions of any kind. Man Investments reserves the right to  
> monitor, record and retain all electronic communications through its  
> network to ensure the integrity of its systems, for record keeping  
> and regulatory purposes.
> Visit us at: www.maninvestments.com
> TG0908
> **********************************************************************
>
>



[Rd] particulars of importing/loading libraries
Simon Urbanek