是否可以在R中重新定义S4类?

时间:2016-05-11 21:09:07

标签: r oop s4

我正在开发一个扩展另一个包的包,它们都使用S4类和方法。更具体地说,我正在研究sads一揽子计划,它扩展了Ben Bolker的bbmle。我们的完整源代码位于:https://github.com/piLaboratory/sads

到目前为止,我已经成功创建了从类mle2扩展bbmle S4类的新类。这些行很好地做到了:

setClass("fitsad", representation("mle2", sad="character", 
  distr="character", trunc="numeric"))
setClass("fitrad", representation("mle2", rad="character", 
  distr="character", trunc="numeric", rad.tab="rad"))

但是,我无法干净地重新定义 bbmle中定义的类。类summary.mle2bbmle的源代码中定义,但我们假装我需要定义一个具有相同名称的新类。将以下行添加到我的源代码会导致一种奇怪的行为:

setClass("summary.mle2", representation(call = "language", 
  coef = "matrix",m2logL = "numeric", fixed="numeric"))

通过此重新定义,可以加载包,并且所有代码都按预期工作。但是,尝试卸载命名空间会导致以下隐藏错误:

> library(sads) ## No errors here
> unloadNamespace("sads")
Error in .getClassFromCache(what, resolve.confl = "all") : 
 argument "where" is missing, with no default
> traceback()
4: .getClassFromCache(what, resolve.confl = "all")
3: .removeSuperclassBackRefs(cl, cldef, searchWhere)
2: methods::cacheMetaData(ns, FALSE, ns)
1: unloadNamespace("sads")

撇开我们是否应该重新定义这门课程的问题,这可能吗?我很抱歉没能在这里提供一个最小的例子,但是我没有能够在不加载/卸载包名称空间的情况下重现这个错误。

1 个答案:

答案 0 :(得分:2)

从r {base}

的标题中删除

setAs(from, to, def, replace, where = topenv(parent.frame()))

您可以使用它来强制从S4到S3类

如果您在帮助热线中输入?setAs(),它应该可以让您获得90%的折扣!您可以使用class()查看它是否有效!

让我知道它是否适合您。如果你遇到困难,我会尽力帮助你。