Karl Forner
2013-Oct-18 15:51 UTC
[Rd] Possible problem with namespaceImportFrom() and methods for generic primitive functions
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]]
John Chambers
2013-Oct-18 21:20 UTC
[Rd] Possible problem with namespaceImportFrom() and methods for generic primitive functions
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