5

我现在有两种方式的类构造工作:

首先,

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

第二,

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

所以,我的问题是为什么我还要为第一个烦恼,因为第二个是创建对象 BondCashFlows 的一种用户友好的方式?

我知道第一个是类上的方法,但我不知道为什么我必须这样做

4

1 回答 1

9

与简单的 R 函数相比,使用 S4 方法的优点之一是该方法是强类型的。

  1. 拥有签名是一种保护,方法不会暴露给不符合其签名要求的类型。否则会抛出异常。
  2. 通常情况下,您希望根据传递的参数类型来区分方法行为。强类型使这变得非常容易和简单。
  3. 强类型更具可读性(即使在 R 中这个论点可以争论,S4 语法对于初学者来说不是很直观)

在这里和示例中,我定义了一个简单的函数,然后将其包装在一个方法中

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

因此,如果您要将您的方法公开给其他人,最好将它们封装在一个方法中。

于 2013-10-27T00:34:32.207 回答