2013-10-26 36 views
4

我現在有一流的施工人員在兩個方面的工作:一套方法來初始化S4類與使用功能

第一,

setMethod("initialize", signature(.Object = "BondCashFlows"), 
        function(.Object, x, y, ...){ 
        do some things [email protected] = array[,m] 
        } 

第二,

BondCashFlows <- function(){do some things new("BondCashFlows", ...) 

所以,我的問題是爲什麼我甚至不得不打擾第一個,因爲第二個是創建對象BondCashFlows的更友好的方式?

我明白,第一個是一個類的方法,但我不知道爲什麼我要做這個

回答

9

對使用​​S4方法在簡易R功能的優點是,該方法是強烈鍵入

  1. 簽名是一種警衛,方法不會暴露給不符合其簽名要求的類型 。否則會 拋出異常。
  2. 通常情況下,您想區分方法行爲 ,具體取決於傳遞的參數類型。強大的打字功能使其非常簡單易用。
  3. 強類型是多個人類可讀的(即使R中這種說法,可以討論,該S4語法不是很直觀專門對於一個初學者)

這裏和示例,其中,I定義一個簡單的函數,那麼我

show.vector(mtcars,'cyl') ## works 
show.vector(mtcars,1:10)  ## DANGER!!works but not the desired behavior 
show.vector(mtcars,-1)  ## DANGER!!works but not the desired behavior 

比較方法調用:如果你測試這一種方法包裝它現在

show.vector <- function(.object,name,...).object[,name] 

## you should first define a generic to define 
setGeneric("returnVector", function(.object,name,...) 
    standardGeneric("returnVector") 
) 

## the method here is just calling the showvector function. 
## Note that the function argument types are explicitly defined. 
setMethod("returnVector", signature(.object="data.frame", name="character"), 
      def = function(.object, name, ...) show.vector(.object,name,...), 
      valueClass = "data.frame" 
) 

returnVector(mtcars,'cyl') ## works 
returnVector(mtcars,1:10) ## SAFER throw an excpetion 
returnVector(mtcars,-1)  ## SAFER throw an excpetion 

因此,如果你會暴露你的方法給他人,這是更好地封裝它們的方法

+2

謝謝,這有助於我理解爲什麼包含BondCashFlows的類不再有效。我沒有將函數設置爲通用。我想我也需要這樣做。我有一個類,然後我設置了一個通用函數,然後是方法。唷,我迷失在這一切中。但是,這是有益的感謝 –