[Rd] validity testing as part of '@<-'

Martin Morgan mtmorgan at fhcrc.org
Sat Sep 23 02:06:47 CEST 2006


While on the topic... validObject might check that the object (and its
slots) is actually the new S4:

> validObject(a)
[1] TRUE
> isS4(a)
[1] FALSE
> sessionInfo()
R version 2.4.0 beta (2006-09-22 r39490) 
x86_64-unknown-linux-gnu 

locale:
LC_CTYPE=en_US;LC_NUMERIC=C;LC_TIME=en_US;LC_COLLATE=en_US;LC_MONETARY=en_US;LC_MESSAGES=en_US;LC_PAPER=en_US;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=en_US;LC_IDENTIFICATION=C

attached base packages:
[1] "methods"   "stats"     "graphics"  "grDevices" "utils"     "datasets" 
[7] "base"     


Thomas Lumley <tlumley at u.washington.edu> writes:

> On Fri, 22 Sep 2006, Parlamis Franklin wrote:
>
>> all those points are good ones, i just wonder what happens to S4
>> "guarantees" when invalid objects are allowed to exist.  one of the
>> advantages of methods, as i understand, is that they can be written
>> with absolute confidence about what is being passed to them, and thus
>> do not need to contemplate a bunch of different possibilities (and as
>> a result can be terse and stylized). it seems if you really want
>> bulletproof code, you have to make validObject the first call in any
>> method definition to which an object with a validity method is being
>> passed (and which relies on receiving a valid object).  i am not sure
>> whether the time spent in those validObject calls is less than the
>> time that might be spent in enforcing validity checks on all possible
>> object mutations.
>
> I think the contract is that new() guarantees an object is valid, and that 
> programmers must guarantee that object mutation maintains validity. 
> validObject() is available as a tool to help programmers fulfill their 
> side of the bargain, but its use is not required. Given this contract it 
> is not necessary for methods to check that the objects they are given are 
> valid.
>
> Since validObject() isn't guaranteed to be true when changes are in 
> progress, it is not easy to identify a necessary and sufficient set of 
> places to call validObject() to ensure validity automatically.
>
> The other consequence of validObject() not being compulsory is that it can 
> be slow -- it can check properties that are expensive to verify but are 
> cheap to maintain. For example, you could have a data object where 
> validObject() did a lot of range checks and consistency checks between 
> variables.  Redoing these checks would be appropriate for a [<- method, 
> which changes the values, but not for a [ method that just extracts a 
> subset.
>
>  	-thomas
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel

-- 
Martin T. Morgan
Bioconductor / Computational Biology
http://bioconductor.org




More information about the R-devel mailing list