Hi,

I am having a similar issue as reported by Paul, but I don't think Martin's
example is precisely representative of the problem.

Consider a hierarchy A <- B <- C:

> setClass("A")
[1] "A"
> setClass("B", contains="A")
[1] "B"
> setClass("C", contains="B")
[1] "C"

Now define a coerce method:

> setAs("A", "list", function(from) list())
> showMethods("coerce", classes="list")
Function: coerce (package methods)
from="A", to="list"
from="ANY", to="list"

Coercing an instance "B" to a list works fine:
> as(new("B"), "list")
list()
> showMethods("coerce", classes="list")
Function: coerce (package methods)
from="A", to="list"
from="ANY", to="list"
from="B", to="list"
    (inherited from: from="A", to="list")

But note the coerce method has now been cached. It seems though that a
cached "inherited" B->list coerce method is given equal priority to the
original A->list coerce method during method selection for coercing C->list:

> as(new("C"), "list")
list()
Warning message:
Ambiguous method selection for "coerce", target "C#list" (the first of the
signatures shown will be used)
    B#list
    A#list

And so we have an ambiguity. Is this by design? Note that coercing (and thus
caching) C->list first, avoids this problem:

> setAs("A", "list", function(from) list())
> showMethods("coerce", classes="list")
Function: coerce (package methods)
from="A", to="list"
from="ANY", to="list"
> as(new("C"), "list")
list()
> showMethods("coerce", classes="list")
Function: coerce (package methods)
from="A", to="list"
from="ANY", to="list"
from="C", to="list"
    (inherited from: from="A", to="list")

> as(new("B"), "list")
list()
> showMethods("coerce", classes="list")
Function: coerce (package methods)
from="A", to="list"
from="ANY", to="list"
from="B", to="list"
    (inherited from: from="A", to="list")
from="C", to="list"
    (inherited from: from="A", to="list")

> as(new("C"), "list")
list()

Thanks,
Michael

On Wed, Aug 27, 2008 at 7:46 AM, Martin Morgan <[EMAIL PROTECTED]> wrote:

> Hi Paul -- does this make the problem more explicit?
>
> > ## class hierarchy
> > setClass("A", representation=representation(a="numeric"))
> [1] "A"
> > setClass("B", representation=representation(b="numeric"))
> [1] "B"
> > setClass("C", contains=c("A", "B"))
> [1] "C"
>
> > ## coerce methods -- in some instances implicitly created
> > setAs("A", "numeric", function(from) slot(from, "a"))
> > setAs("B", "numeric", function(from) slot(from, "b"))
>
> > ## trouble: C equidistant from A, B so no unambiguous nearest 'coerce'
> > ## method
> > as(new("C"), "numeric")
> numeric(0)
> Warning message:
> Ambiguous method selection for "coerce", target "C#numeric" (the first
> of the signatures shown will be used)
>     A#numeric
>    B#numeric
>
> The solution is to define a method to resolve the conflict, e.g.,
>
> setAs("C", "numeric", function(from) {
>    ## avoid breaking the class abstraction
>    as(as(from, "A"), "numeric") *
>            as(as(from, "B"), "numeric")
> })
>
> I don't know how you want to break your particular tie; that has to do
> with the classes you're extending.
>
> Martin
>
> Paul Gilbert <[EMAIL PROTECTED]> writes:
>
> > I am extending a DBI connection by
> >
> > setClass("TSPostgreSQLConnection",
> > contains=c("PostgreSQLConnection","TSdbOptions"))
> >
> > but the first time I use this I am getting a warning when it tries to
> > coerce  the  TSPostgreSQLConnection to a PostgreSQLConnection. After
> > the first use the warning stops,  but the first warning is causing me
> > problems when I do automatic checks and set my tests to stop on
> > warnings. (I think there should be a correct way to do this that does
> > not produce a warning.)  I can trace it back by setting
> > options(warn=2) as below.  Do I need to be more specific about how the
> > coercion  happens? If so, what is the correct way to coerce the
> > TSPostgreSQLConnection into a PostgreSQLConnection? If not, how to a
> > get rid of the warning?
> >
> > Paul Gilbert
> >
> >
> >  > TSdelete("vec", con)
> > Error: (converted from warning) Ambiguous method selection for
> > "coerce", target "TSPostgreSQLConnection#integer" (the first of the
> > signatures shown will be used)
> >    PostgreSQLConnection#integer
> >    dbObjectId#integer
> >  > traceback()
> > 15: doWithOneRestart(return(expr), restart)
> > 14: withOneRestart(expr, restarts[[1]])
> > 13: withRestarts({
> >        .Internal(.signalCondition(simpleWarning(msg, call), msg,
> >            call))
> >        .Internal(.dfltWarn(msg, call))
> >    }, muffleWarning = function() NULL)
> > 12: .signalSimpleWarning("Ambiguous method selection for \"coerce\",
> > target \"TSPostgreSQLConnection#integer\" (the first of the signatures
> > shown will be used)\n    PostgreSQLConnection#integer\n
> > dbObjectId#integer\n",
> >        quote(NULL))
> > 11: warning(gettextf(paste("Ambiguous method selection for \"%s\",
> > target \"%s\"",
> >        "(the first of the signatures shown will be used)\n%s\n"),
> >        [EMAIL PROTECTED], .sigLabel(classes), paste("   ", names(methods),
> >            collapse = "\n")), domain = NA, call. = FALSE)
> > 10: .findInheritedMethods(signature, fdef, mtable = allmethods, table
> > = mlist,
> >        useInherited = useInherited, verbose = verbose)
> > 9: selectMethod("coerce", sig, optional = TRUE, c(from = TRUE, to =
> FALSE),
> >       fdef = coerceFun, mlist = coerceMethods)
> > 8: as(obj, "integer")
> > 7: isIdCurrent(con)
> > 6: postgresqlQuickSQL(conn, statement, ...)
> > 5: dbGetQuery(con, paste("SELECT tbl  FROM Meta ", where, ";"))
> > 4: dbGetQuery(con, paste("SELECT tbl  FROM Meta ", where, ";"))
> > 3: TSdbi:::TSdeleteSQL(serIDs = serIDs, con = con, ...)
> > 2: TSdelete("vec", con)
> > 1: TSdelete("vec", con)
> >  >  str(con)
> > Formal class 'TSPostgreSQLConnection' [package "TSPostgreSQL"] with 4
> slots
> >  ..@ Id     : int [1:2] 21795 1
> >  ..@ dbname : chr "test"
> >  ..@ vintage: logi FALSE
> >  ..@ panel  : logi FALSE
> >
> ====================================================================================
> >
> > La version française suit le texte anglais.
> >
> >
> ------------------------------------------------------------------------------------
> >
> > This email may contain privileged and/or confidential in...{{dropped:26}}
> >
> > ______________________________________________
> > R-devel@r-project.org mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-devel
>
> --
> Martin Morgan
> Computational Biology / Fred Hutchinson Cancer Research Center
> 1100 Fairview Ave. N.
> PO Box 19024 Seattle, WA 98109
>
> Location: Arnold Building M2 B169
> Phone: (206) 667-2793
>
> ______________________________________________
> R-devel@r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>

        [[alternative HTML version deleted]]

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

Reply via email to