[R-pkg-devel] Extending an S3 method, but putting the package in Suggests?

Martin Maechler maechler at stat.math.ethz.ch
Tue Mar 14 17:35:19 CET 2017


>>>>> David Hugh-Jones <davidhughjones at gmail.com>
>>>>>     on Tue, 14 Mar 2017 09:26:49 +0000 writes:

    > Just out of interest, what would happen if I used the hacky solution of
    > simply  exporting my own method like:

    > as.FlexTable <- function(x, ...) UseMethod("as.FlexTable")

    > I am fairly sure you will tell me that fire and brimstone will rain down…
    > But it sure seems simple  compared to writing another package and getting
    > it on CRAN...

no fire etc, but pretty close ;-)

You will have two (internal) methods tables for as.FlexTable,
one in ReporteRs, one in your package, and from a user point of
view there's a deep abyss in functionality between working with

  require(ReporteRs); require(huxtable)

and working with

  require(huxtable); require(ReporteRs)

This is undesirable and error prone and can be resolved by
correct imports as those mentioned.

Martin

    > David

    > On Tue, 14 Mar 2017 at 09:06, Martin Maechler <maechler at stat.math.ethz.ch>
    > wrote:

    >> >>>>> David Hugh-Jones <davidhughjones at gmail.com>
    >> >>>>>     on Tue, 14 Mar 2017 02:46:35 +0000 writes:
    >> >>>>> David Hugh-Jones <davidhughjones at gmail.com>
    >> >>>>>     on Tue, 14 Mar 2017 02:46:35 +0000 writes:
    >> 
    >> > Hi,
    >> > Cross-posted from SO:
    >> >
    >> http://stackoverflow.com/questions/42776058/extending-an-s3-generic-from-an-optional-package
    >> 
    >> ((sent my answer there as well))
    >> 
    >> > I have a package which provides an as.FlexTable method for its
    >> objects,
    >> > extending the S3 generic from the ReporteRs package. So, my
    >> NAMESPACE file,
    >> > generated by roxygen, has lines:
    >> 
    >> > importFrom(ReporteRs,as.FlexTable)
    >> > ...
    >> > S3method(as.FlexTable,huxtable)
    >> > ...
    >> > export(as.FlexTable)
    >> 
    >> > I don't much want to put ReporteRs in Imports: in the DESCRIPTION
    >> file,
    >> > because it involves a big external dependency on Java. But, when I
    >> put it
    >> > into Suggests:, R CMD check gives me errors like "Namespace
    >> dependency not
    >> > required".
    >> 
    >> > Is there anyway I can extend the generic without making a hard
    >> dependency?
    >> 
    >> No.  Importing is a hard dependency..
    >> Some people do not import formally but use  '<pkgNamespace>::<obj>'
    >> instead, *and* conditionalize their code on the availability of
    >> that namespace.
    >> I don't recommend that at all, and particularly not for
    >> extending a generic.
    >> 
    >> I recommend you talk with the maintainer of 'ReporteRs':
    >> 1) You could use a common (yet-to-create) very small package say
    >> 'flexS3generics'
    >> which provides S3 generics (and S4 if ..) you want to use
    >> both, and then both you and her/him import from that mini package.
    >> You'd be both authors of that package.
    >> 
    >> 2) If your package is much smaller (in its footprint, incl
    >> dependencies) than 'ReporteRs' she/he may agree to import the
    >> S3 generic from your package instead of the other way around.
    >> 
    >> Both are clean solutions,
    >> and both need some time-coordination when releasing to CRAN,
    >> '1)' being easier: Once the 'flexS3generics' is released to
    >> CRAN, change (both) your package(s) to
    >> importFrom(flexS3generics,*) but these changes and CRAN
    >> submissions are then independent of each other.
    >> 
    >> 
    >> > Cheers,
    >> > David
    >> 
    >> --
    > Sent from Gmail Mobile

    > [[alternative HTML version deleted]]



More information about the R-package-devel mailing list