[R] Dependency between packages for Windows-binaries
Jon Olav Skoien
j.skoien at geo.uu.nl
Tue Jun 9 18:58:11 CEST 2009
Hi,
I have already asked a similar question without response
(https://stat.ethz.ch/pipermail/r-help/2009-June/200300.html) so I am
here reformulating in the hope that someone is able to help. If
something is unclear, please ask.
I am working on the development of two packages, pkg1 and pkg2 (based on
work in two different projects). pkg1 is quite generic, pkg2 tries to
solve a particular problem within same field (geostatistics). Therefore,
there might be users who want to use pkg2 as an add-on package to
increase the functionality of pkg1. In other words, functions in pkg1
are based on the S3 class system, and I want pkg2 to offer methods for
pkg2-objects to functions defined in pkg1, for users having both
packages installed. Merging the packages or making pkg2 directly
dependent pkg1 would be the easiest solution, but it is a bad solution
as most users will only be interested in one of the packages.
I thought this could be solved by including the following in NAMESPACE
of pkg2:
if ("pkg1" %in% rownames(utils:::installed.packages()) {
importFrom(pkg1, fun1, fun2, fun3)
S3method(fun1, class2)
S3method(fun2, class2)
S3method(fun3, class2)
}
Unfortunately, this doesn't seem to work as I expected, particularly
when I try to build a binary for Windows-users (R CMD build -binary
pkg2). It seems for me that the dependency between pkg2 and pkg1 is
defined at the time of building a binary, not when the package is loaded
with library(pkg2):
If I have pkg1 installed when I build pkg2, the package will not load
for users who do not have pkg1 installed:
> install.packages("d:/pkg2_0.1-1.zip", repos=NULL)
> library(pkg2)
(...)
Error : object 'fun1' not found whilst loading namespace 'pkg2'
Error: package/namespace load failed for 'pkg2'
If I remove pkg1 from the library before building pkg2, pkg2 can be
installed and loaded by everyone, but the new method is not visible for
those with pkg1 installed:
> install.packages("d:/pkg2_0.1-2.zip", repos=NULL)
> library(pkg1)
> library(pkg2)
> methods(fun1)
[1] fun1.class1*
Non-visible functions are asterisked
I have tried with and without one of the following:
Suggests: pkg1
Enhances: pkg1
in the DESCRIPTION file of pkg2, but I cannot see that either of them
make a difference.
I can of course solve this problem temporarily, building two different
versions of pkg2, with and without having pkg1 installed on my computer.
But first of all, that seems unnecessary complicated, and more
important, the plan is also to upload these packages to CRAN where I
doubt that such a two-version solution is possible or accepted.
Is there a way to build one binary that works both with and without
having pkg1 installed? I have tried to search in mail archives and
"Writing R extensions", but either it is not there, or I have missed it.
Thanks,
Jon
BTW, I am using R version 2.9.0 and Rtools version 29 under Windows XP-SP3
More information about the R-help
mailing list