与简单的 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"
)
现在,如果您对此进行测试:
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
因此,如果您要将您的方法公开给其他人,最好将它们封装在一个方法中。