From mtmorgan at fhcrc.org  Fri Dec 16 00:34:52 2011
From: mtmorgan at fhcrc.org (Martin Morgan)
Date: Thu, 15 Dec 2011 15:34:52 -0800
Subject: [Rd] S4 NAMESPACE method imports and exports do not include
 (promoted?) generics
Message-ID: <4EEA841C.5060709@fhcrc.org>

In

 > R.version.string
[1] "R Under development (unstable) (2011-12-15 r57901)"

section 1.6.6 of 'Writing R Extensions' says

   Note that exporting methods on a generic in the namespace will
   also export the generic, and exporting a generic in the
   namespace will also export its methods.

and

   Note that importMethodsFrom will also import any generics defined in
   the namespace on those methods

However, if PkgA promotes 'unique' to a generic and exports that

   DESCRIPTION:
   Imports: methods

   R/f.R:
   setGeneric("unique")

   NAMESPACE:
   export(unique)

and PkgB creates and exports a method on unique

   DESCRIPTION
   Imports: methods, PkgA

   R/f.R:
   setClass("B", representation(b="numeric"))
   setMethod(unique, "B",
             function(x, incomparables=FALSE, ...) unique(x at b))

   NAMESPACE:
   importFrom(PkgA, unique)
   exportClasses(B)
   exportMethods(unique)

and PkgC wants to import PkgB's classes and methods

   DESCRIPTION
   Imports: methods, PkgB

   R/f.R
   cunique <- function(x) unique(x)

   NAMESPACE
   importMethodsFrom(PkgB, unique)
   export(cunique)

then

(a) the 'unique' generic is not available to the user of PkgB

 > library(PkgB)
 > unique(new("B", b=1:5))
Error in unique.default(new("B", b = 1:5)) :
   unique() applies only to vectors

and (b) the generic has not been imported to PkgC's namespace

 > cunique(new("B", b=1:5))
Error in unique.default(b) : unique() applies only to vectors

A workaround is for PkgB to also export(unique), and for PkgC to also 
importFrom(PkgA, unique), but is this the intention?

This is arising from Bioconductor efforts to place commonly promoted 
functions and S3 classes into a single package, to avoid conflicts when 
the same function is promoted independently by several packages.

Martin
-- 
Computational Biology
Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N. PO Box 19024 Seattle, WA 98109

Location: M1-B861
Telephone: 206 667-2793



[Rd] S4 NAMESPACE method imports and exports do not include (promoted?) generics
Martin Morgan