getMethod("summary", signature = "FitDiff") 出错

Error in getMethod("summary", signature = "FitDiff")

我正在使用 semTools::compareFit 比较 lavaan 对象。它抛出一条非常奇怪的错误消息。

我还尝试了以下可重现的示例:

data("HolzingerSwineford1939",package="lavaan")
HS.modelA <- ' visual  =~ x1 + x2 + x3
              textual =~ x4 + x5 + x6
              speed   =~ x7 + x8 + x9'

HS.modelB<- ' visual  =~ x1 + x2
              textual =~ x4 + x5 + x6
              speed   =~ x7 + x8 + x9'
fit.A<- cfa(HS.modelA, data = HolzingerSwineford1939)
fit.B<- cfa(HS.modelB, data = HolzingerSwineford1939)
semTools::compareFit(fit.A,fit.B)

它returns:

Error in getMethod("summary", signature = "FitDiff") : no method found for function 'summary' and signature FitDiff

此外,由于代码在函数内部,但我希望看到屏幕上打印的输出,我还包括:

result<-semTools::compareFit(fit.A,fit.B)
semTools::saveFile(result, file="",what="summary", tableFormat=FALSE)

这个returns

Length Class Mode

  1 FitDiff      S4

我在第一条错误消息中看到与 summary 和方法相关的内容...我有一些 S3 summary 方法,试图在一个包中形式化供个人使用...不确定它是否相关......我有可能搞砸了什么吗? 它发生在 RStudio 安装的多个项目中...我的印象是它以前工作过...

感谢任何帮助。

我在这里报告我是如何规避这个问题的。

这里发生的事情的结论:

这确实是 S3 方法扰乱 S4 方法分派的问题。

如果我在加载 semTools 包之前加载 showMethods(summary),我得到:

Function "summary":
 <not an S4 generic function>)

但是如果我在加载后加载 showMethods(summary),我得到:

Function: summary (package base)
object="ANY"
object="FitDiff"
    (inherited from: object="ANY")
object="lavaan"
object="lavaanList"
object="mle"

所以,解决方案:

考虑到FitDiff对象结构,我创建了一个summary.FitDiff(s3方法):

summary.FitDiff<-function(object){
          print(object@nested)
          return(object@fit)
}

并且此 summary 方法与 FitDiff 对象一起使用:

a<-semTools::compareFit(fit.A,fit.B)
summary(a)

这不是一个完美的解决方案,理想的解决方案应该涉及如何在不弄乱所有可能的 s4 方法的情况下指定 s3 方法,但我对 s4 方法的了解还不够……它暂时解决了我的问题。 ..