[Rd] Possible problem with namespaceImportFrom() and methods for generic primitive functions

John Chambers jmc at r-project.org
Fri Oct 18 23:20:25 CEST 2013


Very good report.

Should be fixed in the development version for 3.1.0 and in 3.0.2 patched. (svn revision 64076).

John


On Oct 18, 2013, at 8:51 AM, Karl Forner <karl.forner at gmail.com> wrote:

> Hi all,
> 
> I have a problem with a package that imports two other packages which both
> export a method for the `[` primitive function.
> 
> I set up a reproducible example here:
> https://github.com/kforner/namespaceImportFrom_problem.git
> 
> Basically, the testPrimitiveImport package imports testPrimitiveExport1 and
> testPrimitiveExport2, which both export a S4 class and a `[` method for the
> class.
> Then:
> R CMD INSTALL -l lib testPrimitiveExport1
> R CMD INSTALL -l lib testPrimitiveExport2
> 
> The command:
> R CMD INSTALL -l lib testPrimitiveImport
> 
> gives me:
> Error in namespaceImportFrom(self, asNamespace(ns)) :
>  trying to get slot "package" from an object of a basic class ("function")
> with no slots
> 
> I get the same message if I check the package (with R CMD check), or even
> if I try to load it using devtools::load_all()
> 
> 
> I tried to investigate the problem, and I found that the error arises in
> the base::namespaceImportFrom() function, and more precisely in
> this block:
>    for (n in impnames) if (exists(n, envir = impenv, inherits = FALSE)) {
>        if (.isMethodsDispatchOn() && methods:::isGeneric(n,  ns)) {
>            genNs <- get(n, envir = ns)@package
> 
> Here n is '[', and the get(n, envir = ns) expression returns
> .Primitive("["), which is a function and has no @package slot.
> 
> This will only occur if exists(n, envir = impenv, inherits = FALSE) returns
> TRUE, i.e. if the '[' symbol is already in the imports env of the package.
> In my case, the first call to namespaceImportFrom() is for the first import
> of testPrimitiveExport1, which runs fine and populate the imports env with
> '['.
> But for the second call, exists(n, envir = impenv, inherits = FALSE) will
> be TRUE, so that the offending line will be called.
> 
> 
> I do not know if the problem is on my side, e.g. from a misconfiguration of
> the NAMESPACE file, or if it is a bug and in which case what should be done.
> 
> Any feedback appreciated.
> 
> Karl Forner
> 
> 	[[alternative HTML version deleted]]
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



More information about the R-devel mailing list