[R-pkg-devel] Courtesy methods and explosive dependencies

Lenth, Russell V ru@@ell-lenth @ending from uiow@@edu
Fri May 25 17:38:40 CEST 2018


I agree that most of the package dependencies in multcomp are worth having, but that is not the point. The point is that if a developer wants to write a method for a generic function offered in another non-base package, that creates false dependencies: packages that users are required to have, but that aren't actually used by the method. I certainly wasn't trying to diss multcomp; that was just a concrete illustration. 

Russ

-----Original Message-----
From: Martin Maechler [mailto:maechler using stat.math.ethz.ch] 
Sent: Friday, May 25, 2018 2:13 AM
To: Lenth, Russell V <russell-lenth using uiowa.edu>
Cc: r-package-devel using r-project.org
Subject: Re: [R-pkg-devel] Courtesy methods and explosive dependencies

>>>>> Lenth, Russell V 
>>>>>     on Thu, 24 May 2018 23:14:42 +0000 writes:

    > Package developers, I am trying to severely cut down on
    > the number of dependencies of my package emmeans. It is
    > now 48, which is quite a few (but that is down from over
    > 100 in the preceding version, where I made the unwise
    > choice of including a particularly greedy package in
    > Imports). I hate to force users to install dozens of
    > packages that they don't really need or want, but it seems
    > very hard to avoid.

    > Case in point: emmeans provides additional methods for
    > 'cld' and 'glht' from the multcomp package. Accordingly, I
    > import their generics, and register my additional
    > methods. But because I import the generics, I must list
    > multcomp in Imports, and that results in the addition of
    > 16 required packages, some of which I never use. More
    > important, I believe that NONE of those 16 packages are
    > required for the correct functioning of my courtesy
    > methods. The only things I really need are the generics.

There must be a mistake here -- I think in your perception:

'multcomp' does *not* have excessive dependencies (though I'd say one too much):

> tools::package_dependencies("multcomp")
$multcomp
[1] "stats"     "graphics"  "mvtnorm"   "survival"  "TH.data"   "sandwich" 
[7] "codetools"

> tools::package_dependencies("multcomp", recursive=TRUE)
$multcomp
 [1] "stats"     "graphics"  "mvtnorm"   "survival"  "TH.data"   "sandwich" 
 [7] "codetools" "methods"   "utils"     "zoo"       "Matrix"    "splines"  
[13] "MASS"      "grDevices" "grid"      "lattice"  

> 

Apart from "base + recommended" packages (which *everyone* has installed), these are just 4 packages:

     mvtnorm
     TH.data
     sandwich
     zoo     

where  mvtnorm, sandwich, and zoo  really are among the (formally undefined) recommended-level-2 R packages... so I do wonder if you really had needed to install.

The 'TH.data' { TH <==>  maintainer("multcomp") } package I think should not be in the strict dependencies of 'multcomp' but rather in its "Suggests".... something I'd say must be true for all data packages: 
The whole idea of data packages is that they should be needed for interesting help page examples, vignettes, maybe even tests, but not for package functionality.

In sum: I'd strongly advise to not change from keeping multcomp among your imports.

Martin Maechler
ETH Zurich

    > On the flip side, emmeans defines some generics of its own
    > that I invite other package developers to extend so that
    > emmeans supports their models. If those packages import
    > emmeans, there is an overhead of 48 dependencies; again,
    > most of these are packages that are not needed at all for
    > those packages' methods to work. I don't like being
    > responsible for that.

    > I believe this is a very common problem, not just with my
    > own packages. It's one thing to extend a base method like
    > 'print'; but extending methods in contributed packages
    > creates these dependency explosions. I have hundreds of
    > packages installed on my system - a couple dozen I care
    > about, another few dozen that seem fairly desirable, and a
    > couple hundred that I don't even know what they're for,
    > other than that things will break if I uninstall them.

    > I do know of a couple ways to reduce these dependencies in
    > the case of my multcomp dependencies:

    > 1. I could simply export my S3 methods for cld and glht as
    > functions, rather than registering them as S3 methods.
    > Then I could move multcomp to Suggests. The downside is
    > that it clutters the namespace for emmeans.

    > 2. I could define the generics for cld and glht in my own
    > package, and export them; and move multcomp to Suggests.
    > Again, it clutters the namespace, and creates warning
    > messages about (if not real issues with) masking.

    > Probably (1) is better than (2), but is it better than
    > what I do now? Is there something else that I (and
    > probably a whole lot of other people) don't know?

    > I wish there were an ImportGenerics or an
    > ImportWithoutDependencies or some such field possible in
    > DESCRIPTION.

    > I appreciate any suggestions. Thanks

    > Russ

    > --
    > Russell V. Lenth  -  Professor Emeritus Department of
    > Statistics and Actuarial Science    The University of Iowa
    >  -  Iowa City, IA 52242  USA    Voice (319)335-0712  -
    >  FAX (319)335-3017 russell-lenth using uiowa.edu  -
    >  http://www.stat.uiowa.edu/~rlenth/ 

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



More information about the R-package-devel mailing list