每个S4都需要是通用的

时间:2015-05-06 17:03:54

标签: r oop s4

假设我们有以下虚拟类

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")
    }
)

如果这个函数类型只有一个特定的“实例”,那么没有理由定义一个通用的,正确的吗?

1 个答案:

答案 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

所以,现在你的通用包括你真正想要的唯一功能。根据应用程序的开发方式,您还可以选择在将来添加泛型。