set方法初始化S4类与使用函数

时间:2013-10-26 23:02:59

标签: r s4

我现在有两种方式的课程构建:

第一个,

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

第二,

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

所以,我的问题是为什么我甚至不得不打扰第一个,因为第二个更像是一个用户友好的方式来创建对象BondCashFlows?

我明白第一个是课堂上的方法,但我不确定为什么要这样做

1 个答案:

答案 0 :(得分:9)

使用S4方法优于简单R函数的一个优点是该方法强类型

  1. 签名是一种保护,方法不会暴露于类型 这不符合他们的签名要求。否则它会 抛出异常。
  2. 通常情况下,您希望区分方法行为 取决于传递的参数类型。强大的打字能力 非常简单。
  3. 强类型更易于人类阅读(即使在R中这个论点可以辩论,S4语法对初学者来说也不是很直观)
  4. 在这里和示例中,我定义了一个简单的函数,然后将其包装在方法

    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"
    )
    

    现在,如果你测试一下:

    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 
    

    与方法调用相比:

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

    因此,如果您将方法暴露给他人,最好将它们封装在方法中