S4类可能不包含"尝试错误"类对象?

时间:2014-04-01 00:37:37

标签: r validation s4

可重复的例子:

setClass("test", representation(a="ANY"))
A <- structure("blahblahblah", class="try-error")
new("test", a=A)
# Error in validObject(.Object) : invalid class “test” object: blahblahblah

我认为问题源于validObject的第29行:

sloti <- try(switch(namei, .S3Class = S3Class(object), 
  slot(object, namei)), silent = TRUE)

slot(object, namei)返回一个try-error类对象时,显然会触及后面的任何内容。

无论如何,在我离开并提出tryCatch替补之前,我想在这里问一下这对其他人来说是不是一个错误。

如果你好奇为什么我会做这样的事情,我正在构建S4类来存储任意表达式评估的结果,在我的一个测试用例中碰巧包含了{的结果{1}}陈述。

1 个答案:

答案 0 :(得分:1)

不,问题出在下一行:

if (inherits(sloti, "try-error")) {
   errors <- c(errors, sloti)
   next
}

一个hacky解决方法是:

safeNew <- function(...) {
  suppressMessages(trace(validObject, quote(inherits <- function(...)
    if (eval.parent(substitute(namei != '.S3Class' && class(slot(object, namei)) == 'try-error'))) FALSE
    else base::inherits(...)), at = 11))
  capture.output(res <- new(...))
  suppressMessages(untrace(validObject))
  res
}

setClass("test", representation(a="ANY"))
A <- structure("blahblahblah", class="try-error")
safeNew("test", a = A) # Now returns no error.
编辑:我上面改了一些代码,所以它现在正确地键入了检查而不是禁用类型检查。例如,

setClass("test", representation(a="ANY", b = "character"))
A <- structure("blahblahblah", class="try-error")
safeNew("test", a = A, b = 5) 
# Error in validObject(.Object) :
#  invalid class “test” object: invalid object for slot "b" in class "test": got class "numeric", should be or extend class "character"