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 =================================================================== --- src/library/base/R/namespace.R (revision 58917) +++ src/library/base/R/namespace.R (working copy) @@ -930,8 +930,10 @@ 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@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel