From jmc at r-project.org  Fri Jun 19 18:31:48 2009
From: jmc at r-project.org (John Chambers)
Date: Fri, 19 Jun 2009 12:31:48 -0400
Subject: [Rd] validObject throws non-caught error when slot doesn't exist
In-Reply-To: <4A3B9D80.70903@r-project.org>
References: <4A3AD0ED.4030002@fhcrc.org> <4A3B9D80.70903@r-project.org>
Message-ID: <4A3BBD74.9040303@r-project.org>

A fix for this and related problems is now committed (r48803).

Some of the interesting ways that validObject() could fail previously 
are in the attached regression-test file.

John

John Chambers wrote:
> Patrick,
>
> Thanks for the bug report and the proposed patch.
>
> There are some related ways that validObject can fail (e.g., if the 
> revised class definition extends one of the object types or if the 
> object is an S3 object), so the patch needs to be a little more 
> general, but I will commit something to the 2.10 development version 
> and send mail).
>
> John
>
> Patrick Aboyoun wrote:
>> I have been retooling an S4 class definition to include another slot 
>> and have found that the methods::validObject function (defined in 
>> methods/R/SClasses.R) in R-devel throws an error that isn't caught 
>> internally (and thus not controllable by 'test' argument) when 
>> retrieving a non-existent slot. The offending line of code is shown 
>> below:
>>
>> > validObject
>> function (object, test = FALSE, complete = FALSE)
>> {
>> ...
>>    for (i in seq_along(slotTypes)) {
>>        classi <- slotTypes[[i]]
>>        sloti <- slot(object, slotNames[[i]]) # offending line of code
>>
>> One potential patch is to substitute the offending line with
>>
>>        sloti <- try(slot(object, slotNames[[i]]), silent = TRUE)
>>        if (class(sloti) == "try-error") {
>>            errors <- c(errors, paste("missing slot \"", slotNames[[i]],
>>                "\"", sep = ""))
>>            next
>>        }
>>
>> Here is a reproduce and an example using vaildObject2 that 
>> substitutes the offending line with the code given above:
>>
>> > setClass("Foo", representation(bar = "character"))
>> [1] "Foo"
>> > a <- new("Foo", bar = letters)
>> > setClass("Foo", representation(bar = "character", star = "numeric"))
>> [1] "Foo"
>> > validObject(a, test = TRUE)
>> Error in slot(object, slotNames[[i]]) :
>>  no slot of name "star" for this object of class "Foo"
>> > validObject2(a, test = TRUE)
>> [1] "missing slot \"star\""
>> > sessionInfo()
>> R version 2.10.0 Under development (unstable) (2009-06-12 r48755)
>> i386-apple-darwin9.6.0
>>
>> locale:
>> [1] en_US.UTF-8/en_US.UTF-8/C/C/en_US.UTF-8/en_US.UTF-8
>>
>> attached base packages:
>> [1] stats     graphics  grDevices utils     datasets  methods   base   
>>
>> Patrick
>>
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: testValidSlot.R
URL: <https://stat.ethz.ch/pipermail/r-devel/attachments/20090619/1b2bf22f/attachment.pl>


[Rd] validObject throws non-caught error when slot doesn't exist
John Chambers