No need for generic functions and methods. Just looking at the hierarchy of the classes shows the problem.

With Martin's simplified version:

> library(PkgA)
> extends("A")
[1] "A"
> library(PkgB)
> extends("B")
[1] "B" "A"
> setClassUnion("C", c("matrix", "A"))
> extends("A")
[1] "A" "C"
> extends("B")
[1] "B" "A"


So defining the union does not make all the subclasses of "A" members of the union.

The next comments are guesses but plausible. Loading the namespace of PkgB may not update the known subclasses of classes from PkgA.

This is one of R's touchier points in general: The state of things with respect to classes and methods changes dynamically as packages are loaded. Until PkgB is loaded, "A" has no known subclasses.

If the guess is correct, then when the class union is formed, nothing tells us that "A" has a subclass "B" that should be added to the union.

Fixing this properly may involve the load-time actions and not be quite trivial.

John


On 5/7/13 11:05 PM, Renaud Gaujoux wrote:
Hi,

I started this post on bioc-devel but this seems to be more general:

https://stat.ethz.ch/pipermail/bioc-devel/2013-May/004311.html

See reproducible example from Martin below.

Thank you.

Renaud

---------- Forwarded message ----------
From: Martin Morgan <mtmor...@fhcrc.org>
Date: 7 May 2013 19:55
Subject: Re: [Bioc-devel] ExpressionSet and LumiBatch: inheritance problem
in S4 methods for union class
To: Renaud Gaujoux <ren...@mancala.cbio.uct.ac.za>
Cc: bioc-de...@r-project.org, dupan.m...@gmail.com

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



______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to