2013-08-26 10 views
6

Podaj funkcję names: jest to prymitywna funkcja w R. Dla funkcji pierwotnych tworzony jest niejawny rodzajowy S4, więc możliwe jest skonstruowanie metod S4 dla tej funkcji.Dodaj dodatkowe argumenty do niejawnego generatora S4 dla funkcji pierwotnej.

Take klasy S4 zdefiniowane następująco:

setClass("aClass", 
     representation=list(
      values = "character", 
      id = "numeric" 
      ), 
     prototype=list(
      values = character(0), 
      id = numeric(0)), 
     validity=function(object){ 
      length([email protected])==length([email protected]) 
     } 
     ) 

Teraz chcę utworzyć funkcję, aby wyodrębnić nazwy, albo posortowane lub nieposortowane. Chciałem to zrobić za pomocą funkcji names, aby uniknąć konieczności tworzenia nowej funkcji, ponieważ jest to mniej intuicyjne.

Poniższa daje wyobrażenie o tym, co należy zrobić:

setMethod("names",signature="aClass", 
    function(x,ordered=TRUE){ 
     if(ordered) 
     [email protected][[email protected]] 
     else 
     [email protected] 
    } 

to nie będzie działać, jak names jest prymitywne i ordered funkcja nie jest argumentem za domniemane rodzajowy.

Jak mogę dokonać tej pracy w następujących warunkach:

  • funkcja names powinny zachować swój pierwotny zachowanie dla wszystkich innych obiektów, w tym obiektów z innymi pakietami.
  • kod powinien być dopuszczalny do użytku w pakiecie
  • kod powinien być akceptowalny przez wysokie standardy określone np. Przez Bioconductor.

Odpowiedz

5

Ogólny jest dostępny jako

> getGeneric("names") 
standardGeneric for "names" defined from package "base" 

function (x) 
standardGeneric("names", .Primitive("names")) 
<environment: 0x459c9c0> 
Methods may be defined for arguments: x 
Use showMethods("names") for currently available ones. 

więc od podpisania widać, że krótka odpowiedź jest taka, że ​​nie można dodać argumenty. Na pewno nie chcesz tworzyć własnej funkcji names. Hack używałby globalnej zmiennej pakietowej, ale ja sam nie brałbym udziału w tym rozwiązaniu.

Pod pewnymi względami umowa określona przez names nie mówi nic o zamówieniu (np. Nazwy i numeracje są często używane do podzbioru, czy są to indeksy liczbowe uporządkowanych nazw, czy nazwy nieuporządkowane?), Więc tak naprawdę proponujesz nowy rodzajowy.

+0

Dziękuję za odpowiedź, ale właśnie to powiedziałem na moje pytanie: nie mogę użyć dodatkowego argumentu. Indeksy liczbowe odnoszą się do uporządkowanych nazw i zestawu innych szczelin (rzeczywisty obiekt jest o wiele bardziej złożony i nie można zamówić wszystkich szczelin). Używam dodatkowego gniazda do wskazania, czy obiekt został zamówiony, czy nie. Mam długą drogę do "uporządkowania" uporządkowanych nazw. Miałem jednak nadzieję, że uda mi się to zrobić bez hackowania. Globalna zmienna pakietowa to rodzaj hackowania, którego nawet nie rozważałbym jako ważnej opcji. :) –

+2

Tak, z twojego pytania wydawało się, że wiesz, że odpowiedź brzmi "nie", ale ponieważ zadałeś to pytanie, odpowiedziałem;) –

+0

Miałem nadzieję, że jest jakiś sposób, o którym nie wiedziałem, ale obawiam się, że " Będę musiał zadowolić się "nie" :) Daje mi to jeszcze kilka dni, a następnie masz zaakceptowaną odpowiedź. –

Powiązane problemy