Я разрабатываю метод S4, который должен использовать объект S3. Метод S4 отлично работает с объектом S4 obj
. Я хочу использовать его для объекта S3 b
, который имеет классы
class(b)
[1] "list" "ts"
классы b
могут быть любыми, если они s3. Вот код (адаптированный из Advanced R Хэлдли Уикхэма):
setOldClass("ts")
setClass("A")
setClass("A1", contains = "A")
setClass("A2", contains = "A1")
setClass("A3", contains = "A2")
setGeneric("bar",function(a) standardGeneric("bar"))
setMethod("bar",signature(a = "A"),function(a) "A here")
setMethod("bar",signature(a = "ts"),function(a) "ts here")
#setMethod("bar",signature(a = "list"),function(a) "list here")
obj <- new("A1")
bar(obj)
b = list(no = 1:3,let=c("a","b"))
class(b) = c("list","ts")
bar(b)
Я получаю следующий вывод и ошибку:
[1] "bar"
[1] "A here"
Error in (function (classes, fdef, mtable) : unable to find an inherited method for function ‘bar’ for signature ‘"list"’
Traceback:
3.stop(gettextf("unable to find an inherited method for function %s for signature %s", sQuote(fdef@generic), sQuote(cnames)), domain = NA)
2.(function (classes, fdef, mtable) { methods <- .findInheritedMethods(classes, fdef, mtable) if (length(methods) == 1L) ...
1.bar(b)
Я знаю, что могу создать новый метод с подписью list
, и он будет работать. Но я не хочу этого делать. Я хочу использовать ts
в качестве подписи. Как мне это сделать?
Мне кажется, если у меня есть множественное наследование в объекте S3, если универсальный S4 использует его, он ищет только первый класс, возвращаемый вектором class(s3object)
. Как я могу определить методы, которые будут смотреть и на другие классы?