2015-05-06 2 views
6

Предположим, мы имеем следующую фиктивной классделает каждый S4 должен быть универсальным

Foo <- setClass(Class = "Foo",slots = c(foo = "numeric"), 
    prototype = list(foo = numeric()) 

Я думал, дженерики используются для перегрузки различных функций. Поэтому предположим, что мы хотим реализовать аксессор:

setMethod(f = "getFoo", signature = "Foo", 
    definition = function(Foo) 
    { 
     return([email protected]) 
    } 
) 

Действительно ли это? Или я должен определить общие первый:

setGeneric(name="getFoo", 
    def=function(Foo) 
    { 
     standardGeneric("getFoo") 
    } 
) 

Если есть только один конкретный «экземпляр» эта функция типа, нет никаких причин, чтобы определить общие, правильно?

ответ

1

Для определения метода S4 должен существовать существующий S4-общий (либо от base, либо импортированный из другого пакета, либо определенный самостоятельно). Я понимаю, что этот дизайн обеспечивает гибкость добавления дополнительных методов в будущем, даже если вы даже не можете представить себе еще один банкомат.

При этом, если вы просто пытаетесь быть более краткими, вы можете просто предоставить функцию по умолчанию непосредственно общей функции.

setClass(Class = "Foo",slots = c(foo = "numeric"), 
       prototype = list(foo = numeric())) 

setGeneric(name="getFoo", 
      def=function(Foo) 
      { 
       standardGeneric("getFoo") 
      }, useAsDefault=function(Foo){return([email protected])} 
) 

# test the function 
testFoo <- new("Foo", foo=3) 

getFoo(testFoo) 
[1] 3 

Итак, теперь у вас есть общий характер, включая единственную функциональность, которую вы действительно хотели в любом случае. У вас также есть возможность добавить в общий ролик в будущем в зависимости от того, как ваше приложение развивается.

+0

спасибо большое! что многое проясняет. – math

Смежные вопросы