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 at 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 at x > 0 )
setClass("bar",
representation( y="foo", z="numeric" ),
validity = function( object ) object at z > 0 )
obj <- new( "bar", y = new( "foo", x=1 ), z = 1 )
and then...
validObject( obj )
[1] TRUE
## invalidate obj at y
obj at y@x <- -1
validObject( obj at y ) # right, this is not valid
Error in validObject(obj at y) : invalid class "foo" object: FALSE
## obj at 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"