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([EMAIL PROTECTED]) 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 ) [EMAIL PROTECTED] > 0 ) >setClass("bar", > representation( y="foo", z="numeric" ), > validity = function( object ) [EMAIL PROTECTED] > 0 ) >obj <- new( "bar", y = new( "foo", x=1 ), z = 1 ) > >and then... > > > >>validObject( obj ) >> >> >[1] TRUE >## invalidate [EMAIL PROTECTED] > > >>[EMAIL PROTECTED]@x <- -1 >>validObject( [EMAIL PROTECTED] ) # right, this is not valid >> >> >Error in validObject([EMAIL PROTECTED]) : invalid class "foo" object: FALSE > > >>## [EMAIL PROTECTED] 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]] ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel