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

Reply via email to