[Rd] how to unbreak a circular package dependence (S4 class data)

Hervé Pagès hpages at fhcrc.org
Wed Jan 29 02:01:57 CET 2014

Hi Daniel,

On 01/28/2014 03:49 PM, Daniel Kelley wrote:
> I have an issue with a circular package dependence that prevents building/checking, and I seek advice on breaking the circle so the packages can pass the build-check tests that are required for CRAN submission.
> The package pair I'm working with is slow to build, but my tests suggest the issue may be general, and so I will explain it in general terms.
> Suppose there are two packages:
> 1. Foo, a package that defines some data types with S4 classes.
> 2. Foodata, a package that provides such datasets, for use by Foo.
> With this setup, it seems reasonable that Foo "depends" on Foodata, so the data can be used in Foo and its documentation.
> Since the data within Foodata are S4 classes as defined in Foo, an attempt to build-check Foodata will produce an error unless Foo is present.  But Foo cannot be built unless Foodata exists, since it depends on it.  Thus neither Foo nor Foodata can be built and checked.

I've learned by experience that it's generally better (although not
always possible) to avoid putting serialized S4 objects in a data
package. They will break if you need to modify a little bit the
internals of the class (and chances are high that you will at some
point). Better to store the data in a format that is more or less
guaranteed to remain the same for years (SQLite, XML, hdf5, plain text,
serialized data frame, SAM/BAM, etc...) and try to come up with
a fast way to load and turn the data into an S4 object on demand.

Not always possible if the data is huge... but for the purpose of using
it in Foo's examples and vignette do you really need huge data?

Another advantage of this approach is that the data can then be
more easily shared because it can be accessed with tools other
than yours, e.g. tools that don't know about S4 and even non-R


> One solution would be to wrap the Foo documentation examples (and relevant Foo code) in require() blocks, and to make Foo "suggest" Foodata, not "depend” upon it.  My question is whether this is the recommended practice, or the common practice.
> Thanks in advance to anyone who wishes to offer hints.
> PS. The problem arose from an attempt to reduce CRAN load by extracting the datasets that had been contained within a previous version of Foo.
> PPS. my (slow-building) packages are on github and I can supply details if needed.
> Dan E. Kelley
> Professor, Oceanography Department
> Dalhousie University, Canada
> Dan.Kelley at Dal.CA<mailto:Dan.Kelley at Dal.CA>
> 	[[alternative HTML version deleted]]
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel

Hervé Pagès

Program in Computational Biology
Division of Public Health Sciences
Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N, M1-B514
P.O. Box 19024
Seattle, WA 98109-1024

E-mail: hpages at fhcrc.org
Phone:  (206) 667-5791
Fax:    (206) 667-1319

More information about the R-devel mailing list