我正在研究擴展另一個軟件包的軟件包,並且他們都使用S4類和方法。更具體地說,我正在研究sads
包,它擴展了Ben Bolker的bbmle
。我們的完整源代碼在這裏:https://github.com/piLaboratory/sads是否可以重新定義R中的S4類?
到目前爲止,我已經成功創建了新類,它們從包bbmle
擴展了mle2
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
定義一個類。在bbmle
的源代碼中定義了類summary.mle2
,但假設我需要定義一個具有相同名稱的新類。添加一個怪異的行爲下面一行到我的源代碼結果:
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")
撇開我們是否應該重新定義這一類的問題或沒有,這是可能的嗎?我很抱歉無法在這裏提供一個最簡單的例子,但是我沒有能夠在不加載/卸載軟件包命名空間的情況下重現此錯誤。