2013-06-15 6 views
5

Używam metody setMethod do przesłonięcia funkcji "podsumowania" dla obiektów różnych klas.R Programowanie: użycie metody setMethod do zastąpienia funkcji "podsumowania" dla grupy klas

Początkowo użyłem tego podejścia:

setMethod('summary', "class_1", 
      function(object, ...) { 
      #code for class_1 summary here... 
      }   
) 

setMethod('summary', "class_2", 
      function(object, ...) { 
      #code for class_2 summary here... 
      }   
) 

setMethod('summary', "class_3", 
      function(object, ...) { 
      #code for class_3 summary here... 
      }   
) 

... i tak dalej dla każdej klasy.

Jednak w sumie istnieje 12 różnych klas, więc kod stał się bardzo powtarzalny. Chcąc uniknąć takich powtórzeń, stworzyłem funkcję zawierający nazwy Klasa:

all_classes = function() { 
    c("class_1", "class_2", "class_3") #and so on for each class 
} 

Następnie użyłem lapply:

lapply(
    1:length(all_classes()), 
    function(k) 
    setMethod('summary', all_classes()[k], 
       function(object, ...) { 
        #code here... 
       } 
    ) 
) 

To działa, ale chciałbym wiedzieć, czy istnieje lepszy sposób osiągnięcia mojego celu, polegającego na zwartym tworzeniu funkcji "podsumowania" dla każdej klasy.

Dzięki,

John.

Odpowiedz

6

Wzór elewacji realizuje lekkie metody na wierzchu funkcji podrzędnego konia roboczego. Zwykle każda metoda wykonuje pewne wstępne przetwarzanie przed wywołaniem funkcji kończyn roboczych. W prostym przypadku, w którym nie ma wstępnego przetwarzania i nie masz żadnego interesu w zwracanej wartości setClass, sensowne jest użycie pętli for zamiast lapply. Więc

.my_summary <- function(object, ...) {} 
for (cl in all_classes()) 
    setMethod(summary, cl, .my_summary) 

Ponadto, że .my_summary prace na kilku klasach oznacza, że ​​zajęcia dzielić wspólną strukturę, a więc mogą być ułożone w hierarchii klas i metody zdefiniowanej w klasie bazowej.

setClass("A", representation(x="numeric")) 
setClass("A1", contains="A") 
setClass("A2", contains="A") 
setMethod(summary, "A", function(object, ...) {}) 

W jednym S4 można użyć wielu dziedziczenie dostarczenie rodzaju kształtu programowaniu

setClass("Summary") 
setMethod(summary, "Summary", function(object, ...) {}) 
setClass("B1", contains=c("A", "Summary")) 

B1 następnie danych dziedziczy gniazdo (x) z A i z zachowaniem Streszczenie. Wysłanie metody w tym przypadku może być mylące (która metoda jest wybrana, jeśli zarówno A, jak i Podsumowanie mają metodę sumaryczną?).

+0

Dzięki @Martin. Znalazłem również inne rozwiązanie, używając setClassUnion ("groupName", c ("class_1", "class_2", "class_3")) itd., A następnie definiując funkcję podsumowania dla "groupName". –

Powiązane problemy