Patrick Aboyoun
2009-Jun-18 23:42 UTC
[Rd] validObject throws non-caught error when slot doesn't exist
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
John Chambers
2009-Jun-19 14:15 UTC
[Rd] validObject throws non-caught error when slot doesn't exist
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 >