我正在开发一个扩展另一个包的包,它们都使用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.mle2
在bbmle
的源代码中定义,但我们假装我需要定义一个具有相同名称的新类。将以下行添加到我的源代码会导致一种奇怪的行为:
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")
撇开我们是否应该重新定义这门课程的问题,这可能吗?我很抱歉没能在这里提供一个最小的例子,但是我没有能够在不加载/卸载包名称空间的情况下重现这个错误。
答案 0 :(得分:2)
从r {base}
的标题中删除 setAs(from, to, def, replace, where = topenv(parent.frame()))
您可以使用它来强制从S4到S3类
如果您在帮助热线中输入?setAs()
,它应该可以让您获得90%的折扣!您可以使用class()
查看它是否有效!
让我知道它是否适合您。如果你遇到困难,我会尽力帮助你。