Я бы хотел понять, как проходит этап R, чтобы найти подходящую функцию при смешивании S3 и S4. Вот пример:
set.seed(1)
d <- data.frame(a=rep(c('a', 'b'), each=15),
b=rep(c('x', 'y', 'z'), times=5),
y=rnorm(30))
m <- lme4::lmer(y ~ b + (1|a), data=d)
l <- lsmeans::lsmeans(m, 'b')
multcomp::cld(l)
Я не до конца понимаю, что происходит, когда исполняется последняя строка.
multcomp::cld
печатает UseMethod("cld")
, поэтому отправка метода S3.
isS4(l)
показывает, что l
является объектом класса S4.
Кажется, что несмотря на вызов универсального S3, система диспетчеризации S3 полностью игнорируется. Создание функции print.lsmobj <- function(obj) print('S3')
(так как class(l)
равно lsmobj
) и выполнение cld(l)
не печатает "S3"
.
showMethods(lsmobj)
или showMethods(ref.grid)
(суперкласс), не перечислятьвсе, что напоминает функцию cld
.
Использование debugonce(multcomp::cld)
показывает, что функция, которая вызывается в конечном итоге, равна cld.ref.grid
из lsmeans
.
Однако мне было интересно, какПоймите, что cld.ref.grid
будет в конечном итоге вызываться без каких-либо "уловок", таких как debugonce
. То есть какие шаги R выполняет, чтобы добраться до cld.ref.grid
.