我正在尝试让R在有下一个类时调用NextMethod:
e = new.env()
class(e) = c(class(e), "c11", "c22")
print.c11 = function(e, ...) {
print(e$x);
tryCatch({
NextMethod()
}, warning = function(w) {
}, error = function(e) {
}, finally = {
})
}
print.c22 = function(e, ...) {
print(e$y)
tryCatch({
NextMethod()
}, warning = function(w) {
}, error = function(e) {
}, finally = {
})
}
e$x = 111
e$y = 222
print(e)
这是一个肮脏的黑客,它将涵盖该方法可能产生的所有错误和警告。怎么能这样做呢?
上面的代码类型没有tryCatch块,因为我认为调用了print.default函数。现在举一个例子(修改过)Hadley的高级R书:
> baz <- function(x) UseMethod("baz", x)
> baz.c <- function(x) c("c", NextMethod())
> baz.d <- function(x) c("d", NextMethod())
> c <- structure(1, class = c("c", "d"))
> baz(c)
Show Traceback
Rerun with Debug
Error in NextMethod() : no method to invoke
理想情况下,如果没有下一个类,NextMethod函数应该返回NULL。
答案 0 :(得分:2)
实施默认方法,例如
baz.default <- function(x) NULL
和
> c <- structure(1, class = c("c", "d"))
> baz(c)
[1] "c" "d"