Rev 20397 | Rev 25118 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
\name{validObject}\alias{validObject}\alias{setValidity}\alias{getValidity}\title{ Test the Validity of an Object }\description{The validity of \code{object} related to its class definition istested. If the object is valid, \code{TRUE} is returned; otherwise,either a vector of strings describing validity failures is returned,or an error is generated (according to whether \code{test} is\code{TRUE}).The functions \code{getValidity} and \code{setValidity} get and setthe validity method of a class. This method is a function of oneobject that returns \code{TRUE} or a description of the non-validity.}\usage{validObject(object, test)getValidity(ClassDef)setValidity(Class, method, where = 1 )}\arguments{\item{object}{ Any object, but not much will happen unless theobject's class has a formal definition.}\item{test}{ If \code{test} is \code{TRUE}, and validity fails thefunction returns a vector of strings describing the problems. If\code{test} is \code{FALSE} (the default) validity failure generatesan error.}\item{Class}{The name or class definition of the class whose validity method is to beset.}\item{ClassDef}{The class definition of the class whose validity method is to beretrieved.}\item{method}{A validity method; that is, either \code{NULL} or afunction of one argument (the \code{object}). Like\code{validObject}, the function should return \code{TRUE} if theobject is valid, and one or more descriptive strings if any problemsare found. Unlike \code{validObject}, it should never generate anerror.}\item{where}{ The modified class definition will be stored in thisposition on the search list.}Note that validity methods do not have to check validity of anyslots or superclasses: the logic of \code{validObject} ensuresthese tests are done once only. As a consequence, if one validitymethod wants to use another, it should extract and call the methodfrom the other definition of the other class by calling\code{\link{getValidity}}: it should \emph{not} call\code{validObject}.}\details{Validity testing takes place ``bottom up'': first the validity of theobject's slots, if any, is tested. Then for each of the classes thatthis class extends (the ``superclasses''), the explicit validitymethod of that class is called, if one exists. Finally, the validitymethod of \code{object}'s class is called, if there is one.Testing generally stops at the first stage of finding an error, exceptthat all the slots will be examined even if a slot has failed itsvalidity test.}\value{\code{validObject} returns \code{TRUE} if the object is valid.Otherwise a vector of strings describing problems found, except thatif \code{test} is \code{FALSE}, validity failure generates an error,with the corresponding strings in the error message.}\references{The R package \code{methods} implements, with a few exceptions, theprogramming interface for classesand methods in the book \emph{Programming with Data} (JohnM. Chambers, Springer, 1998), in particular sections 1.6, 2.7, 2.8,and chapters 7 and 8.While the programming interface for the methods package follows the reference,the R software is an original implementation, so details inthe reference that reflect the S4 implementation may appeardifferently in R. Also, there are extensions to the programminginterface developed more recently than the reference. For adiscussion of details and ongoing development, see the web page\url{http://developer.r-project.org/methodsPackage.html} and thepointers from that page.}\seealso{ \code{\link{setClass}}. }\examples{setClass("track",representation(x="numeric", y = "numeric"))t1 <- new("track", x=1:10, y=sort(rnorm(10)))## A valid "track" object has the same number of x, y valuesvalidTrackObject <- function(x){if(length(x@x) == length(x@y)) TRUEelse paste("Unequal x,y lengths: ", length(x@x), ", ", length(x@y),sep="")}## assign the function as the validity method for the classsetValidity("track", validTrackObject)## t1 should be a valid "track" objectvalidObject(t1)## Now we do something badt1@x <- 1:20## This should generate an error\dontrun{try(validObject(t1))}\testonly{stopifnot(is(try(validObject(t1)), "try-error"))}}\keyword{programming}\keyword{classes}