Argh! Namespace and union class: a nice explosive recipe... Thanks Martin for the example reduction! I will forward/continue this to r-devel.
Renaud On 7 May 2013 19:55, Martin Morgan <mtmor...@fhcrc.org> wrote: > On 05/07/2013 04:04 AM, Renaud Gaujoux wrote: > >> Hi, >> >> I am getting an error when calling an S4 method, which is defined for a >> union class that includes ExpressionSet, on a LumiBatch object: >> >> The error prototype is as follows: >> >> - 'A' is Union of 'B' and 'C' >> - 'D' extends 'C' >> - a method myfun() exists for class 'A' >> => myfun('C') works but not myfun('D') >> >> Error is like: >> Error in (function (classes, fdef, mtable) : >> unable to find an inherited method for function myfun for signature >> "D" >> >> This works well on a toy example, but breaks when ExpressionSet are >> involved. >> So, I don't know if this is an R problem or something related to class >> ExpressionSet, or possibly LumiBatch (I Cc Pan Du for this reason). I >> remember that a while ago I was getting such errors even when defining the >> method for ExpressionSet and calling it on LumiBatch objects. >> > > I can replicate this with a simpler example, where PkgA has > > setClass("A", representation(x="numeric")) > > with NAMESPACE > > import(methods) > exportClasses("A") > > PkgB has > > setClass("B", contains="A") > > NAMESPACE > > import(methods) > importClassesFrom("PkgA", "A") > exportClasses("B") > > and then > > library(PkgA); library(PkgB) > setClassUnion("C", c("matrix", "A")) > setGeneric("do", function(x) standardGeneric("do")) > setMethod("do", "C", function(x) "done") > > leading to > > > do(new("A")) > [1] "done" > > do(new("B")) > > Error in (function (classes, fdef, mtable) : > unable to find an inherited method for function do for signature > "B" > > suggesting name space issues rather than something about ExpressionSet. > The sample packages and test script are attached; it would be appropriate > to pursue this on the R-devel mailing list. > > Martin > > >> Thank you for any help. >> >> Bests, >> Renaud >> >> ############################## >> # Toy example: >> ############################## >> >> R --vanilla --quiet <<EOF >> >> setClass('B', contains = 'character') >> setClass('C', contains = 'character') >> setClass('D', contains = 'C') >> setClassUnion('A', c('B', 'C')) >> >> setGeneric('myfun', function(x, ...) standardGeneric('myfun')) >> setMethod('myfun', 'A', function(x) print(class(x)) ) >> >> # works on C >> myfun(new('C')) >> >> # works on D >> try( myfun(new('D')) ) >> >> # seems that inherits does not catch the inheritance >> d <- new('D') >> is(d, 'A') >> inherits(d, 'A') >> extends(class(d), 'A') >> EOF >> >> ## OUTPUT FOR TOY EXAMPLE >> >> setClass('B', contains = 'character') >>> setClass('C', contains = 'character') >>> setClass('D', contains = 'C') >>> setClassUnion('A', c('B', 'C')) >>> >>> setGeneric('myfun', function(x, ...) standardGeneric('myfun')) >>> >> [1] "myfun" >> >>> setMethod('myfun', 'A', function(x) print(class(x)) ) >>> >> [1] "myfun" >> >>> >>> # works on C >>> myfun(new('C')) >>> >> [1] "C" >> attr(,"package") >> [1] ".GlobalEnv" >> >>> >>> # works on D >>> try( myfun(new('D')) ) >>> >> [1] "D" >> attr(,"package") >> [1] ".GlobalEnv" >> >>> >>> # seems that inherits does not catch the inheritance >>> d <- new('D') >>> is(d, 'A') >>> >> [1] TRUE >> >>> inherits(d, 'A') >>> >> [1] TRUE >> >>> extends(class(d), 'A') >>> >> [1] TRUE >> >>> >>> >> >> ##############################**####################### >> # Concrete example with ExpressionSet and LumiBatch objects: >> ##############################**####################### >> >> ### RUN >> >> R --vanilla <<EOF >> library(Biobase) >> setGeneric('myfun', function(x, ...) standardGeneric('myfun')) >> setClassUnion('A', c('matrix', 'ExpressionSet')) >> setMethod('myfun', 'A', function(x){ >> print(class(x)) >> }) >> >> # works on ExpressionSet >> data(sample.ExpressionSet) >> myfun(sample.ExpressionSet) >> >> # not working on LumiBatch >> library(lumi) >> data(example.lumi) >> try( myfun(example.lumi) ) >> >> # seems that inherits does not catch the inheritance >> is(example.lumi, 'A') >> inherits(example.lumi, 'A') >> extends(class(example.lumi), 'A') >> >> # define method for ExpressionSet ? >> setMethod('myfun', 'ExpressionSet', function(x){ >> message('ExpressionSet method') >> print(class(x)) >> }) >> >> # works well >> myfun(sample.ExpressionSet) >> myfun(example.lumi) >> >> # Session info >> sessionInfo() >> EOF >> >> >> ################## >> #### OUTPUT FOR EXPRESSIONSET >> ################## >> >> R version 3.0.0 (2013-04-03) -- "Masked Marvel" >> Copyright (C) 2013 The R Foundation for Statistical Computing >> Platform: i686-pc-linux-gnu (32-bit) >> >> R is free software and comes with ABSOLUTELY NO WARRANTY. >> You are welcome to redistribute it under certain conditions. >> Type 'license()' or 'licence()' for distribution details. >> >> Natural language support but running in an English locale >> >> R is a collaborative project with many contributors. >> Type 'contributors()' for more information and >> 'citation()' on how to cite R or R packages in publications. >> >> Type 'demo()' for some demos, 'help()' for on-line help, or >> 'help.start()' for an HTML browser interface to help. >> Type 'q()' to quit R. >> >> library(Biobase) >>> >> Loading required package: BiocGenerics >> Loading required package: parallel >> >> Attaching package: BiocGenerics >> >> The following objects are masked from package:parallel: >> >> clusterApply, clusterApplyLB, clusterCall, clusterEvalQ, >> clusterExport, clusterMap, parApply, parCapply, parLapply, >> parLapplyLB, parRapply, parSapply, parSapplyLB >> >> The following object is masked from package:stats: >> >> xtabs >> >> The following objects are masked from package:base: >> >> anyDuplicated, as.data.frame, cbind, colnames, duplicated, eval, >> Filter, Find, get, intersect, lapply, Map, mapply, match, mget, >> order, paste, pmax, pmax.int, pmin, pmin.int, Position, rank, >> rbind, Reduce, rep.int, rownames, sapply, setdiff, sort, table, >> tapply, union, unique, unlist >> >> Welcome to Bioconductor >> >> Vignettes contain introductory material; view with >> 'browseVignettes()'. To cite Bioconductor, see >> 'citation("Biobase")', and for packages 'citation("pkgname")'. >> >> setGeneric('myfun', function(x, ...) standardGeneric('myfun')) >>> >> [1] "myfun" >> >>> setClassUnion('A', c('matrix', 'ExpressionSet')) >>> setMethod('myfun', 'A', function(x){ >>> >> + print(class(x)) >> + }) >> [1] "myfun" >> >>> >>> # works on ExpressionSet >>> data(sample.ExpressionSet) >>> myfun(sample.ExpressionSet) >>> >> [1] "ExpressionSet" >> attr(,"package") >> [1] "Biobase" >> >>> >>> # not working on LumiBatch >>> library(lumi) >>> >> KernSmooth 2.23 loaded >> Copyright M. P. Wand 1997-2009 >> Warning messages: >> 1: replacing previous import image when loading graphics >> 2: replacing previous import nleqslv when loading nleqslv >> >>> data(example.lumi) >>> try( myfun(example.lumi) ) >>> >> Error in (function (classes, fdef, mtable) : >> unable to find an inherited method for function myfun for signature >> "LumiBatch" >> >>> >>> # seems that inherits does not catch the inheritance >>> is(example.lumi, 'A') >>> >> [1] TRUE >> >>> inherits(example.lumi, 'A') >>> >> [1] FALSE >> >>> extends(class(example.lumi), 'A') >>> >> [1] TRUE >> >>> >>> # define method for ExpressionSet ? >>> setMethod('myfun', 'ExpressionSet', function(x){ >>> >> + message('ExpressionSet method') >> + print(class(x)) >> + }) >> [1] "myfun" >> >>> >>> # works well >>> myfun(sample.ExpressionSet) >>> >> ExpressionSet method >> [1] "ExpressionSet" >> attr(,"package") >> [1] "Biobase" >> >>> myfun(example.lumi) >>> >> ExpressionSet method >> [1] "LumiBatch" >> attr(,"package") >> [1] "lumi" >> >>> >>> # Session info >>> sessionInfo() >>> >> R version 3.0.0 (2013-04-03) >> Platform: i686-pc-linux-gnu (32-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] parallel stats graphics grDevices utils datasets methods >> [8] base >> >> other attached packages: >> [1] lumi_2.12.0 Biobase_2.20.0 BiocGenerics_0.6.0 >> >> loaded via a namespace (and not attached): >> [1] affy_1.38.1 affyio_1.28.0 annotate_1.38.0 >> [4] AnnotationDbi_1.22.5 beanplot_1.1 BiocInstaller_1.10.1 >> [7] Biostrings_2.28.0 colorspace_1.2-2 DBI_0.2-6 >> [10] GenomicRanges_1.12.2 grid_3.0.0 illuminaio_0.2.0 >> [13] IRanges_1.18.0 KernSmooth_2.23-10 lattice_0.20-15 >> [16] limma_3.16.3 MASS_7.3-26 Matrix_1.0-12 >> [19] matrixStats_0.8.1 mclust_4.1 methylumi_2.6.1 >> [22] mgcv_1.7-22 minfi_1.6.0 multtest_2.16.0 >> [25] nleqslv_2.0 nlme_3.1-109 nor1mix_1.1-4 >> [28] preprocessCore_1.22.0 RColorBrewer_1.0-5 reshape_0.8.4 >> [31] R.methodsS3_1.4.2 RSQLite_0.11.3 siggenes_1.34.0 >> [34] splines_3.0.0 stats4_3.0.0 survival_2.37-4 >> [37] tools_3.0.0 XML_3.96-1.1 xtable_1.7-1 >> [40] zlibbioc_1.6.0 >> >> [[alternative HTML version deleted]] >> >> >> >> ______________________________**_________________ >> Bioc-devel@r-project.org mailing list >> https://stat.ethz.ch/mailman/**listinfo/bioc-devel<https://stat.ethz.ch/mailman/listinfo/bioc-devel> >> >> > > -- > Computational Biology / Fred Hutchinson Cancer Research Center > 1100 Fairview Ave. N. > PO Box 19024 Seattle, WA 98109 > > Location: Arnold Building M1 B861 > Phone: (206) 667-2793 [[alternative HTML version deleted]]
_______________________________________________ Bioc-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/bioc-devel