[R] Validity check when setting slot

Renaud Gaujoux getoxxx at gmail.com
Fri Aug 14 10:56:50 CEST 2009


It looks like a sound solution.
Thanks Vitalie.

Vitalie S. wrote:
> Hi,
>
>>>
>>>     RG> Hi,
>>>     RG> I'm wondering if the following behaviour is normal:
>>>
>>>     RG> setClass('A', representation(number='numeric'),     RG> 
>>> validity=function(object){     RG> if( object at number < -1 ) 
>>> return("Invalid number"); TRUE})
>>>     >> [1] "A"
>>>     RG> a <- new('A')
>>>     RG> a
>>>     >> An object of class “A”
>>>     >> Slot "number":
>>>     >> numeric(0)
>>>
>>>     RG> a at number <- 0
>>>     RG> a at number <- -3
>>>     RG> a
>>>     >> An object of class “A”
>>>     >> Slot "number":
>>>     >> [1] -3
>>>
>
> Rewriting `@<-` will do the job:
>
> setClass('A', representation(number='numeric'),
>           validity=function(object){
>                         if( object at number < -1 ) return("Invalid number")
>                         TRUE}
> )
>
>
> setMethod("@<-",
>     signature(object = "A"),
>     function (object, name, value){
>         object <- callNextMethod(object, 
> as.character(substitute(name)), value)
>         validObject(object)
>         return(object)
>     }
> )
>
>
>> a <- new('A')
>> a at number <- 23
>> a at number <- -23
> Error in validObject(object) : invalid class "A" object: Invalid number
>
>
> By th way, it seems (to me) that there is a bug in callNextMethod above:
>
>         object <- callNextMethod(object, name, value)
> or
>         object <- callNextMethod()
>
> trigger an error:
>
> Error in checkSlotAssignment(object, name, value) :
>   "name" is not a slot in class "A"
>
> -Vitalie
>
>




More information about the R-help mailing list