2015-01-11 8 views
7

Napisałem pakiet za pomocą klas S4 i chciałby korzystać z funkcji rbind, cbind z tych zdefiniowanych klas.Prawidłowe sposobem użycia cbind, rbind z klas S4 w pakiecie

Ponieważ nie wydaje się być możliwe do zdefiniowania rbind i cbind bezpośrednio jako metody S4 zdefiniowałem rbind2 i cbind2 zamiast:

setMethod("rbind2", signature(x="ClassA", y = "ANY"), 
    function(x, y) { 
     # Do stuff ... 
}) 

setMethod("cbind2", signature(x="ClassA", y = "ANY"), 
    function(x, y) { 
     # Do stuff ... 
}) 

Od ?cbind2 dowiedziałem się, że te funkcje muszą być aktywowane za pomocą methods:::bind_activation zastąpić rbind i cbind z bazy.

włączyłem połączenia w pliku pakiet R/zzz.R przy użyciu funkcji .onLoad:

.onLoad <- function(...) { 
    # Bind activation of cbind(2) and rbind(2) for S4 classes 
    methods:::bind_activation(TRUE) 
} 

To działa zgodnie z oczekiwaniami. Jednak działające CMD R sprawdzić Jestem teraz otrzymuję następujący notatka ponieważ używam unexported funkcję metod:

* checking dependencies in R code ... NOTE 
Unexported object imported by a ':::' call: 'methods:::bind_activation' 
    See the note in ?`:::` about the use of this operator. 

Jak mogę pozbyć się notatki i jaki jest właściwy sposób definiować metody cbind i rbind dla klas S4 w pakiecie?

+0

Czy mógłbyś dołączyć definicje klas (np. 'SetClass (" ClassA ", ...)') z kilku klas S4, do których próbujesz dodać metody 'rbind' i' cbind'? Ułatwiłoby to opracowanie rozwiązania twojego problemu. – nrussell

+1

Definicje klas nie powinny w tym przypadku mieć znaczenia, ponieważ jest to tylko kwestia wyboru/wysłania metody. Więc możesz użyć dowolnej definicji, takiej jak setClass ("ClassA", reprezentacja (a = "numeryczna")). – user625626

+0

Czy mógłbyś również wyjaśnić, dlaczego "* ... nie wydaje się możliwe zdefiniowanie rbind i cbind bezpośrednio jako metody S4 ..." "- może dodasz swój kod, próbując go zaimplementować? – nrussell

Odpowiedz

4

myślę zasadzie strona pomocy cBind w pakiecie Matrix historycznie była dokładna, ale nie ostatnio. Oto klasa

.A = setClass("A", representation(x="numeric")) 

Nie ma uniwersalne, więc utworzyć jedną, wysyłając na '...' argumentu (patrz ?setMethod i ?dotsMethods)

getGeneric("cbind") 
## NULL 
setGeneric("cbind", signature="...") 
## Creating a new generic function for 'cbind' in the global environment 

Następnie wdrożyć metodę

setMethod("cbind", "A", function(..., deparse.level=1) "cbind,A-method") 
## [1] "cbind" 

I wreszcie używać

> cbind(.A(), .A()) 
[1] "cbind,A-method" 

To jest w porządku tak długo, jak „...” argumenty są takie same (prawdopodobnie pochodzi) Klasa, która jest na tyle często dobre.

> cbind(.A(), integer()) 
    [,1] 
[1,] ? 

wierzę, że bind_activation() ma skutki globalne, a nie tylko na temat wysłania w pakiecie; należy go unikać (na przykład nie jest już używany w pakiecie Matrix).

Także myślę, że ten został zaktualizowany w R-devel


r67699 | lawrence | 2015-02-01 10:13:23 -0800 (Nie, 01 lutego 2015) | 4 linie

cbind/rbind teraz przekazują rekursywnie do cbind2 (rbind2), gdy przynajmniej jeden z argumentów jest obiektem S4, a wysyłka S3 nie powiedzie się; również rozważyć S4 dziedziczenie podczas S3 wysłania w * funkcje związać.

Powiązane problemy