[Rd] S4 coercion responsibility

Seth Falcon seth at userprimary.net
Thu Sep 18 06:06:19 CEST 2008


* On 2008-09-17 at 19:25 -0700 Seth Falcon wrote:
> In the latest R-devel code (svn r46542), this behaves differently (and
> works as you were hoping).  I get:
> 
>     library("RSQLite")
>     setClass("SQLConPlus", contains=c("SQLiteConnection","integer"))
>     dd = data.frame(a=1:3, b=letters[1:3])
>     con = new("SQLConPlus", dbConnect(SQLite(), ":memory:"), 11L)
>     dbWriteTable(con, "t1", dd)
>     dbListTables(con)
>     dbDisconnect(con)

*argh* I'm certain this was working for me and yet when I try to
reproduce in a new R shell it errors out.  The dispatch is not as I
wrote.

    as(con, "integer")
    [1] 11

That is, the auto-generated coerce method to integer is selected in
preference to the coerce method for SQLiteConnection.

> I think the new behavior is desirable as it follows the rule that the
> order of the superclasses listed in contains is used to break ties
> when multiple methods match.  Here, there are two coerce() methods
> (invoked via as()) one for SQLiteConnection and one, I believe
> auto-generated, for integer.  Since SQLiteConnection comes first, it
> is chosen.  Indeed, if you try the following, you get the error you
> were originally seeing:
> 
>     setClass("SQLConMinus", contains=c("integer", "SQLiteConnection"))
>     con2 = new("SQLConMinus", dbConnect(SQLite(), ":memory:"), 11L)
>     
>     > as(con, "integer")
>     [1] 15395     2
>     > as(con2, "integer")
>     [1] 11
>     > 

I'm still baffled how this was working for me and now is not.
Nevertheless, I think it is how things *should* work and will do some
further investigation about what's going on.

-- 
Seth Falcon | http://userprimary.net/user/



More information about the R-devel mailing list