2016-05-11 66 views
1

我正在研究擴展另一個軟件包的軟件包,並且他們都使用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") 

撇開我們是否應該重新定義這一類的問題或沒有,這是可能的嗎?我很抱歉無法在這裏提供一個最簡單的例子,但是我沒有能夠在不加載/卸載軟件包命名空間的情況下重現此錯誤。

回答

2

從r的頭條剝去{基地}

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

,如果你在幫助行中鍵入?setAs()它應該讓你可以使用這個從S4強迫到S3類

你90%的路!您可以使用class()來查看它是否有效!

讓我知道它是否適合你。如果你卡住了,我會盡我所能幫助你。

相關問題