假设我们有以下虚拟类
Foo <- setClass(Class = "Foo",slots = c(foo = "numeric"),
prototype = list(foo = numeric())
我认为,泛型用于超载不同的功能。因此,假设我们要实现一个访问器:
setMethod(f = "getFoo", signature = "Foo",
definition = function(Foo)
{
return(Foo@foo)
}
)
这有效吗?或者我必须首先定义通用:
setGeneric(name="getFoo",
def=function(Foo)
{
standardGeneric("getFoo")
}
)
如果这个函数类型只有一个特定的“实例”,那么没有理由定义一个通用的,正确的吗?
答案 0 :(得分:1)
为了定义S4方法,必须有一个现有的S4泛型(来自base
,从另一个包导入或自己定义)。我对这种设计的理解是提供在未来添加其他方法的灵活性,即使你甚至不能设想另一台ATM。
也就是说,如果你只是想简洁一点,你可以直接向泛型函数提供默认函数。
setClass(Class = "Foo",slots = c(foo = "numeric"),
prototype = list(foo = numeric()))
setGeneric(name="getFoo",
def=function(Foo)
{
standardGeneric("getFoo")
}, useAsDefault=function(Foo){return(Foo@foo)}
)
# test the function
testFoo <- new("Foo", foo=3)
getFoo(testFoo)
[1] 3
所以,现在你的通用包括你真正想要的唯一功能。根据应用程序的开发方式,您还可以选择在将来添加泛型。