R 设置方法初始化S4类与使用函数
我现在通过两种方式进行班级建设: 第一,R 设置方法初始化S4类与使用函数,r,s4,R,S4,我现在通过两种方式进行班级建设: 第一, setMethod("initialize", signature(.Object = "BondCashFlows"), function(.Object, x, y, ...){ do some things .Object@foo = array[,m] } 第二, BondCashFlows <- function(){do
setMethod("initialize", signature(.Object = "BondCashFlows"),
function(.Object, x, y, ...){
do some things .Object@foo = array[,m]
}
第二,
BondCashFlows <- function(){do some things new("BondCashFlows", ...)
BondCashFlows与简单的R函数相比,使用S4方法的优点之一是该方法是强类型的
拥有签名是一种保护,方法不会暴露于类型
这不符合他们的签名要求。否则它会的
抛出异常
通常情况下,您需要区分方法行为
取决于传递的参数类型。强大的打字能力使这一点变得更加重要
非常简单
强类型更容易让人理解(即使在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"
)
与方法调用相比:
returnVector(mtcars,'cyl') ## works
returnVector(mtcars,1:10) ## SAFER throw an excpetion
returnVector(mtcars,-1) ## SAFER throw an excpetion
因此,如果您要向其他人公开您的方法,最好将它们封装在方法中谢谢,这有助于我理解为什么包含BondCashFlows的类不再工作。我没有将函数设置为泛型。我想我也需要这样做。我有一个类,然后我设置了一个泛型函数,然后是方法。呸,这一切让我迷路了。但是,这很有帮助,谢谢
returnVector(mtcars,'cyl') ## works
returnVector(mtcars,1:10) ## SAFER throw an excpetion
returnVector(mtcars,-1) ## SAFER throw an excpetion