每个 S4 都需要通用吗
does every S4 needs to be generic
假设我们有以下虚拟对象 class
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")
}
)
如果此函数类型只有一个特定 "instance",则没有理由定义泛型,对吗?
为了定义一个 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
所以,现在您拥有了通用的功能,其中包括您真正想要的唯一功能。您还可以选择在将来根据应用程序的开发方式添加泛型。
假设我们有以下虚拟对象 class
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")
}
)
如果此函数类型只有一个特定 "instance",则没有理由定义泛型,对吗?
为了定义一个 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
所以,现在您拥有了通用的功能,其中包括您真正想要的唯一功能。您还可以选择在将来根据应用程序的开发方式添加泛型。