particulars of importing/loading libraries
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 **********************************************************************