Peng Yu wrote:> I thought that 'validity' defined in 'setClass' should be
called in
> 'new'. Could somebody let me know why 'validity' is not
called? How to
> make it be called?
>
>> setClass(
> + Class='A',
> + representation=representation(
> + x='numeric'
> + ),
> + validity=function(object){
> + cat("~~~ A: inspector ~~~\n")
> + if(object at x<0){
> + stop("[A:validation] object at x<0")
> + }
> + return(T)
> + }
> + )
> [1] "A"
>> setMethod(
> + f='initialize',
> + signature='A',
> + definition=function(.Object,x){
> + cat("~~~ A: initializator ~~~\n")
> + .Object at x=x
> + return(.Object)
> + }
> + )
> [1] "initialize"
The default initialize method (initialize,ANY-method) performs simple
slot assignment and then calls validObject. You do not call the default
method, so do not get slot assignment or validity checking. If you want
only to initialize slots as above, then do not write any initialize
method; let initialize,ANY-method do the work for you. Otherwise, use a
paradigm like
.Object <- callNextMethod(.Object, x=x, ...)
in your initialize method, so that the slot x is assigned and validity
checked by the 'next' (eventually, initialize,ANY) method. Note that
validity is checked in callNextMethod, so that the object has to be
'valid' after x has been assigned to it's slot.
It is also possible to call validObject explicitly as part of your own
initialize method.
Two other issues. Calling new("A") with no arguments does NOT call
validObject, so the default object (e.g., from the prototype argument)
must be valid a priori. It may be useful to define a constructor A <-
function(...) new("A", ...) both to provide a nicer interface to the
user and to map between arguments the user might find convenient and
slots the class wants to store.
Martin
>> new(Class='A', x=10)
> ~~~ A: initializator ~~~
> An object of class \u201cA\u201d
> Slot "x":
> [1] 10
>
> ______________________________________________
> R-help at 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.
--
Martin Morgan
Computational Biology / Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N.
PO Box 19024 Seattle, WA 98109
Location: Arnold Building M1 B861
Phone: (206) 667-2793