[Rd] issue with base:::namespaceImportMethods

From: Michael Lawrence <lawrence.michael_at_gene.com>
Date: Thu, 05 Apr 2012 15:35:30 -0700


Hi,

I've noticed an issue with S4 methods and namespaces which only arises in particular, difficult to reproduce configurations. One example is the ggbio package in Bioconductor, which currently emits these warnings when its namespace is loaded:


library(ggbio)
Loading required package: ggplot2

Attaching package: ‘ggbio’

The following object(s) are masked from ‘package:ggplot2’:

    geom_rect, geom_segment, stat_identity, xlim

Warning messages:
1: found methods to import for function ‘append’ but not the generic itself 2: found methods to import for function ‘as.factor’ but not the generic itself
3: found methods to import for function ‘as.list’ but not the generic itself
4: found methods to import for function ‘aggregate’ but not the generic itself
5: found methods to import for function ‘as.table’ but not the generic itself
6: found methods to import for function ‘complete.cases’ but not the generic itself

7: found methods to import for function ‘cor’ but not the generic itself
8: found methods to import for function ‘diff’ but not the generic itself
9: found methods to import for function ‘drop’ but not the generic itself

------------------------

I tracked these warnings down to the behavior of the base:::namespaceImportMethods, which ends up calling base:::namespaceImportFrom with arguments that seem to violate the assumptions made in that function. It looks like base:::namespaceImportFrom (conditionally) assumes that the "vars", "generics" and "packages" arguments are parallel vectors. However, base:::namespaceImportMethods can end up filtering 'vars' so that it no longer parallels the other two. Maybe I am just misreading the code, but the following patch seems to fix things:

Index: src/library/base/R/namespace.R


 namespaceImportMethods <- function(self, ns, vars) {

     allVars <- character()
+ generics <- character()
+ packages <- character()

     allFuns <- methods:::.getGenerics(ns) # all the methods tables in ns - packages <- attr(allFuns, "package")
+ allPackages <- attr(allFuns, "package")

     pkg <- methods:::getPackageName(ns)
     if(!all(vars %in% allFuns)) {
         message(gettextf("No methods found in \"%s\" for requests: %s",
@@ -950,16 +952,23 @@
         ## import methods tables if asked for
         ## or if the corresponding generic was imported
         g <- allFuns[[i]]

+ p <- allPackages[[i]]
if(exists(g, envir = self, inherits = FALSE) # already imported || g %in% vars) { # requested explicitly - tbl <- methods:::.TableMetaName(g, packages[[i]]) - if(is.null(.mergeImportMethods(self, ns, tbl))) # a new
methods
table

+ tbl <- methods:::.TableMetaName(g, p)
+ if(is.null(.mergeImportMethods(self, ns, tbl))) { # a new
methods t
able

                allVars <- c(allVars, tbl) # import it;else, was merged

+ generics <- c(generics, g)
+ packages <- c(packages, p)
+ }
} if(g %in% vars && !exists(g, envir = self, inherits = FALSE)) { if(exists(g, envir = ns) && - methods:::is(get(g, envir = ns), "genericFunction"))
+ methods:::is(get(g, envir = ns), "genericFunction")) {
allVars <- c(allVars, g)
+ generics <- c(generics, g)
+ packages <- c(packages, p)
+ }
else { # should be primitive fun <- methods::getFunction(g, mustFind = FALSE, where = self) if(is.primitive(fun) || methods::is(fun,
"genericFunction")) {}
@@ -970,7 +979,7 @@
             }
         }
     }

- namespaceImportFrom(self, asNamespace(ns), allVars, allFuns, packages)
+ namespaceImportFrom(self, asNamespace(ns), allVars, generics, packages)
 }

Thanks for any advice,

Michael

PS: sessionInfo() (yes, ggbio has a LOT of dependencies):

> sessionInfo()
R Under development (unstable) (2012-04-04 r58917) Platform: x86_64-unknown-linux-gnu (64-bit)

locale:

 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8
 [7] LC_PAPER=C                 LC_NAME=C
 [9] LC_ADDRESS=C               LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C

attached base packages:
[1] stats graphics grDevices utils datasets methods base

other attached packages:
[1] ggbio_1.2.0 ggplot2_0.9.0 BiocInstaller_1.4.3

loaded via a namespace (and not attached):

 [1] AnnotationDbi_1.18.0    Biobase_2.16.0          BiocGenerics_0.2.0
 [4] biomaRt_2.12.0          Biostrings_2.24.1       biovizBase_1.2.0
 [7] bitops_1.0-4.1          BSgenome_1.24.0         cluster_1.14.2
[10] colorspace_1.1-1        DBI_0.2-5               dichromat_1.2-4
[13] digest_0.5.2            GenomicFeatures_1.8.0   GenomicRanges_1.8.3
[16] grid_2.16.0             gridExtra_0.9           Hmisc_3.9-3
[19] IRanges_1.14.2          lattice_0.20-6          MASS_7.3-17
[22] Matrix_1.0-6            memoise_0.1             munsell_0.3
[25] plyr_1.7.1              proto_0.3-9.2           RColorBrewer_1.0-5
[28] RCurl_1.91-1            reshape2_1.2.1          Rsamtools_1.8.0
[31] RSQLite_0.11.1          rtracklayer_1.16.0      scales_0.2.0
[34] snpStats_1.6.0          splines_2.16.0          stats4_2.16.0
[37] stringr_0.6             survival_2.36-12        tools_2.16.0
[40] VariantAnnotation_1.2.2 XML_3.9-4               zlibbioc_1.2.0

	[[alternative HTML version deleted]]


______________________________________________

R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Thu 05 Apr 2012 - 22:38:07 GMT

This quarter's messages: by month, or sorted: [ by date ] [ by thread ] [ by subject ] [ by author ]

All messages

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Sun 08 Apr 2012 - 12:30:42 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.

list of date sections of archive