2013-05-10 53 views
2

在我的包中,我想從提供的包中繼承TheBaseClass類(因此它不在我的範圍內)。有一個創建這個類的對象的函數。這是該代碼的一個最簡單的例子。範圍S4類,如何使用超類的構造函數

setClass("TheBaseClass", representation(a="numeric")) 
initBase <- function() new("TheBaseClass", a=1) # in reality more complex 

現在我想簡單地使用initBase作爲構造我的子類,但我不知道怎麼 設置新的類

setClass("MyInheritedClass", contains="TheBaseClass") 
initInher <- function() { 
    res <- initBase() 
    class(res) <- "MyInheritedClass" # this does not work for S4 
} 

我如何可以改變的最後一行,使其工作?複製&粘貼initBase函數不是一個選項,因爲它涉及一個.C調用。我讀了setIs,但這似乎不是正確的功能。

任何暗示讚賞!

回答

3

也許this answer提供了更廣泛的解釋。一種模式是對你的類構造函數提供的基類的實例作爲一個未命名的參數

.MyInheritedClass <- setClass("MyInheritedClass", contains="TheBaseClass") 
.MyInheritedClass(initBase()) 

setClass回報發生器功能,這是從調用new真的沒有什麼不同,但似乎更清潔;我在前面用. ,因爲對於「最終用戶」來說,生成器可能太粗糙了,例如,沒有暗示什麼是論據應該是什麼,只是...)。這假定您沒有寫一個initialize方法類,或者說你的初始化方法已構建的方式,與初始化,ANY-法的合同一致,稍微複雜類

.A <- setClass("A", contains="TheBaseClass", 
    representation=representation(x="numeric")) 

setMethod(initialize, "A", 
    function(.Object, ..., x) 
{ 
    x <- log(x)       # your class-specific initialization... 
    callNextMethod(.Object, ..., x = x) # passed to parent constructor 
}) 

該模式要求基類的初始化方法設計正確。在行動中:

> .A(initBase(), x=1:2) 
An object of class "A" 
Slot "x": 
[1] 0.0000000 0.6931472 

Slot "a": 
numeric(0) 
+0

這真的很有幫助;還有你連接的答案,我以前沒有找到。謝謝! – 2013-05-11 00:58:55

相關問題