The problem is over-ambitious documentation.  Recursively running the 
checks on slots for all validObject calls would be a fairly serious 
efficiency hit.  Objects are checked for validity when created, other 
than as the default object, so assuming the slot objects to be as 
claimed is reasonable if they haven't been corrupted later on.  We'll 
update the documentation.

Validity checking is a tricky business in general.  R validates new 
objects, but users can turn valid objects into invalid objects in cases 
where slots have to match in special ways (you can't apply validObject 
each time a slot changes, since the change may be part of a bigger 
computation that _will_ produce a valid object).  Similarly, constraints 
on the elements can't be checked each time an element or subset of the 
object changes, if the changes have to be done in stages.   Systems that 
"commit" top-level assignments can check then, but R does not have that 
distinction.

Martin Morgan wrote:

>The documentation for validObject suggests that slots are checked for
>validity, but validObject seems only to check that the slot has
>something claiming to be correct; validObject(obj) does not perform
>the equivalent of validObject(obj@y) for slot y.
>
>This is also the second problem issue reported in
>
>http://tolstoy.newcastle.edu.au/R/devel/05/03/0151.html
>
>Relevant documentation, an example, and sessionInfo follow.
>
>Martin
>
>validObject             package:methods             R Documentation
>
>Arguments:
>     ...
>     Note that validity methods do not have to check validity of any
>     slots or superclasses:  the logic of 'validObject' ensures these
>     tests are done once only.
>     ...
>Details:
>
>     Validity testing takes place "bottom up":  first the validity of
>     the object's slots, if any, is tested.  
>     ...
>
>setClass("foo",
>         representation( x="numeric" ),
>         validity = function( object ) object@x > 0 )
>setClass("bar",
>         representation( y="foo", z="numeric" ),
>         validity = function( object ) object@z > 0 )
>obj <- new( "bar", y = new( "foo", x=1 ), z = 1 )
>
>and then...
>
>  
>
>>validObject( obj )
>>    
>>
>[1] TRUE
>## invalidate obj@y
>  
>
>>obj@y@x <- -1
>>validObject( obj@y )                  # right, this is not valid
>>    
>>
>Error in validObject(obj@y) : invalid class "foo" object: FALSE
>  
>
>>## obj@y is invalid, but obj is valid?
>>validObject( obj )                    # should be invalid?
>>    
>>
>[1] TRUE
>
>
>
>  
>
>>sessionInfo()
>>    
>>
>Version 2.3.0 Under development (unstable) (2006-03-03 r37471) 
>x86_64-unknown-linux-gnu 
>
>attached base packages:
>[1] "methods"   "stats"     "graphics"  "grDevices" "utils"     "datasets" 
>[7] "base"
>
>______________________________________________
>R-devel@r-project.org mailing list
>https://stat.ethz.ch/mailman/listinfo/r-devel
>
>  
>

	[[alternative HTML version deleted]]

