【发布时间】:2020-02-29 20:05:10
【问题描述】:
我想了解在混合 S3 和 S4 时 R 找到合适函数的步骤。这是一个例子:
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 from lsmeans。
然而,我想知道如何实现cld.ref.grid 最终将被调用而没有像debugonce 这样的任何“技巧”。也就是说,R 执行了哪些步骤才能到达cld.ref.grid。
【问题讨论】:
-
你真的应该升级 lsmeans。你有一个非常旧的版本。 lsmobj 类很久以前就消失了。
-
啊,我知道这一点。这个问题并没有真正与包相关,而是与 R 的方法调度系统相关。只是我不得不调试一些仍在使用 lsmeans 的代码,因此将其用作示例。
-
我想知道您是否先加载 multcomp 库,如果 cld 会出现在 showMethods 中。也就是说,如果泛型不可见,为什么要显示方法。
-
OP 说 '... cld(l) doesn't print "S3" ' 但我认为这是一个错字,因为您定义了
print方法,而不是cld方法。 -
@rvl,你是对的。没想到。