可重复的例子:
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}}陈述。
答案 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"