Я проверял, могу ли я поддерживать модели, приспособленные с использованием пакета cplm в emmeans , и я столкнулся с очень странным поведением метода terms
. Вот пример:
library(emmeans)
library(cplm)
data(mtcars)
m <- cpglm(mpg ~ cyl + disp + hp, data = mtcars)
Функция emmeans:::recover_data.lm
, похоже, обещала работать правильно. Он просто вызывает метод terms
объекта и передает его другим функциям. Однако это не работает:
> emmeans:::recover_data.lm(m)
Error in slot(x, name) :
no slot of name "terms" for this object of class "cpglm"
Копая дальше, я проверяю, что terms()
работает в глобальной среде:
> terms(m)
mpg ~ cyl + disp + hp
... (remaining lines excluded) ...
Однако это не работает в recover_data.lm
:
> debug(emmeans:::recover_data.lm)
> emmeans:::recover_data.lm(m)
...
Browse[2]> terms(object)
Error in slot(x, name) :
no slot of name "terms" for this object of class "cpglm"
Browse[2]> getMethod("terms", "cpglm")
Error in getMethod("terms", "cpglm") :
no method found for function 'terms' and signature cpglm
Однако ...
Browse[2]> getMethod("terms", "cplm") ## cpglm inherits from cplm
Method Definition:
function (x, ...)
attr(x@model.frame, "terms")
... etc. ...
Browse[2]> methods("terms")
[1] terms,ANY-method terms,cplm-method terms.default* terms.formula* terms.gls*
[6] terms.merMod* terms.terms*
see '?methods' for accessing help and source code
Browse[2]> selectMethod("terms", "cpglm")
Method Definition:
function (x, ...)
attr(x@model.frame, "terms")
... etc. ...
Итак, в пространстве имен для emmeans я могу убедиться, что мы «знаем», что существует terms
метод для cpglm
объектов, и мы можем найти его через selectMethod()
, но не через getMethod()
или просто позвонив terms()
. Это очень странно, тем более что документация для selectMethod
обещает, что она должна работать:
Функция selectMethod()
возвращает метод, который будет выбран
для вызова функции f
, если аргументы имеют классы, как указано
signature
.
Наконец, я могу убедиться, что это как-то связано с конфликтом при отправке методов S3:
> stats::terms(m)
Error in slot(x, name) :
no slot of name "terms" for this object of class "cpglm"
Есть ли способ заставить мой пакет emmeans работать правильно, когда есть сочетание методов S3 и S4; в частности, искать методы S4 перед методами S3?