我现在有两种方式的课程构建:
第一个,
setMethod("initialize", signature(.Object = "BondCashFlows"),
function(.Object, x, y, ...){
do some things .Object@foo = array[,m]
}
第二,
BondCashFlows <- function(){do some things new("BondCashFlows", ...)
所以,我的问题是为什么我甚至不得不打扰第一个,因为第二个更像是一个用户友好的方式来创建对象BondCashFlows?
我明白第一个是课堂上的方法,但我不确定为什么要这样做
答案 0 :(得分:9)
使用S4方法优于简单R函数的一个优点是该方法强类型。
在这里和示例中,我定义了一个简单的函数,然后将其包装在方法
中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
因此,如果您将方法暴露给他人,最好将它们封装在方法中。