On Mar 16, 2008, at 8:12 PM, Christophe Genolini wrote:

> Hi the list
>
> I am fighting with the twins setAs and setIs...
>
> Here are some questions and comments (comments to myself but that  
> migth
> be wrong, it is why I am posting them)
> 1. Very surprising : using setIs define 'is', 'as<-' but not 'as' ???
> 2. Using setAs define 'as', 'as<-' but not 'is'...
> What surprise me is that as<- can be define by both. I would have  
> thing
> that setis is for 'is', setAs is for 'as' and 'as<-'...
> Since it is not the case, is there a possibility to set with only one
> function 'as', 'is' and 'as<-'
>
> Last point, I get a warning using setAs. I did not manage to find the
> name of the variable it want me to use...
>
> ### Data
> setClass("B",representation(b="numeric"))
> setClass("C",representation(c="numeric"))
> setClass("D",representation(d="numeric"))
> b <- new("B",b=3)
> c <- new("C",c=4)
> d <- new("D",d=5)
>
> ### using setIs
> setIs("C","B",
>     test=function(object){return([EMAIL PROTECTED]>0)},
>     replace=function(from,values){
>         [EMAIL PROTECTED] <- [EMAIL PROTECTED]
>         return(from)
>     }
> )
> is(c,"B")             #Ok
> as(c,"B")             #not ok

It seems to me your problem here is simply that you did not define a  
coerce cal in setIs, so it does not know how to turn a C object into  
a B object, which is what you ask it to do here. It knows how to test  
if C object is also a B object, because of the test function you  
provided, and it can do the replacement you ask it in as(c,"B") <-b  
because of the replace command you provided, but the third part is  
missing. Perhaps something like this:
setIs("C","B",
        test=function(object){return([EMAIL PROTECTED]>0)},
        replace=function(from,values){
                [EMAIL PROTECTED] <- [EMAIL PROTECTED]
                return(from)
        },
        coerce=function(from) {
                new("B",[EMAIL PROTECTED](1/3))
        }
)


> as(c,"B") <- b        #ok (!)
>
> ### using setAs
> setAs("D","B",
>     function(from,to){to<-new("B",[EMAIL PROTECTED]);return(to)},
>     replace=function(from,values){
>         [EMAIL PROTECTED]<[EMAIL PROTECTED];
>         return(from)
>     }
> )
> is(d,"B")             # not ok
> as(d,"B")             # ok
> as(d,"B")<-b          # ok
>
>
> Thanks
>
> Christophe

Haris Skiadas
Department of Mathematics and Computer Science
Hanover College

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to