2012-06-21 35 views
2

可以說,我想使一個類「myclass」的兩個插槽A和B.擁有自定義類驗證爲添加插槽

現在我想一個validObject功能,以確保A和B是相同的長度

same_length <- function(object){ 
    if(length([email protected])!=length([email protected])) { 
     "vectors are not the same length" 
    } else TRUE 
} 

setClass("myClass", representation(A="numeric", B="numeric"), 
      validity=same_length) 

我看到初始化當一個函數的地方,將確保類是有效的:

setMethod("initialize", "myClass", function(.Object, ...){ 
    value <- callNextMethod() 
    validObject(value) 
    value 
}) 

,如果我嘗試

將發送一個錯誤

newObj < - 新( 「MyClass的」,A = C(1,2,3),B = C(1,2))

但是,如果我做

newObj <- new("myClass") 
[email protected] <- c(1,2,3) 
[email protected] <- c(1,2) 

不引發錯誤。一旦新的插槽分配無法驗證,我如何才能讓它發出錯誤?

回答

0

寫一個'替代方法'來做檢查。要做到這一點,我們需要創建一個通用的功能(因爲用適當的名稱和簽名無功能已經存在)

setGeneric("slotA<-", function(x, ..., value) standardGeneric("slotA<-")) 

然後,我們需要實現因爲我們要處理的特定類型的對象的替代方法 - - 第一個參數是一流的「MyClass的」,第二個參數(value)是類「數字」的:

setReplaceMethod("slotA", c("myClass", "numeric"), function(x, ..., value) { 
    [email protected] = value 
    validObject(x) 
    x 
}) 

我們也可以寫一個「吸」通用和方法

setGeneric("slotA", function(x, ...) standardGeneric("slotA")) 
setMethod("slotA", "myClass", function(x, ...) [email protected]) 

然後

> a=new("myClass", A=1:10, B=10:1) 
> slotA(a) 
 [1]  1  2  3  4  5  6  7  8  9 10 
> slotA(a) = 1:5 
Error in validObject(x) :  
  invalid class "myClass" object: vectors are not the same length 

注意,默認initialize方法調用checkValidity,因此,如果您在構造函數中使用callNextMethod作爲最後一行沒有必要明確檢查的有效性。

+0

你能解釋一下在這種情況下使用setGeneric()和setMethod的區別嗎? – LostLin

+0

@Ellipsis ...試圖澄清setGeneric與setMethod –

+0

啊好吧感謝澄清! – LostLin