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 <oskl...@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
oskl...@maninvestments.com

-----Original Message-----
From: Simon Urbanek [mailto:simon.urba...@r-project.org]
Sent: 14 January 2009 01:51
To: Sklyar, Oleg (London)
Cc: r-devel@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
oskl...@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 <oskl...@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...@.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 <oskl...@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@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
**********************************************************************



______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to