[Rd] issue with base:::namespaceImportMethods
John Chambers
jmc at r-project.org
Sat Apr 7 21:11:21 CEST 2012
Thanks, Michael.
It looks good. I committed it to r-devel (rev 58925).
If nothing bad happens, we can merge it into 2.15.0 patched. (Nothing I
found in CRAN seems to test complicated importMethodsFrom usage.)
John
On 4/5/12 3:35 PM, Michael Lawrence wrote:
> 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 at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
More information about the R-devel
mailing list