Как определить сигнатуру для метода S4, который использует объект S3 с множественным наследованием? - PullRequest
0 голосов
/ 04 января 2019

Я разрабатываю метод 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). Как я могу определить методы, которые будут смотреть и на другие классы?

...