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