2015-01-11 12 views
7

Ho scritto un pacchetto utilizzando le classi S4 e vorrebbe utilizzare le funzioni rbind, cbind con queste classi definite.modo corretto di utilizzare cbind, rbind con le classi S4 nel pacchetto

Dal momento che non sembra essere possibile definire rbind e cbind direttamente come metodi S4 ho definito rbind2 e cbind2 invece:

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

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

Da ?cbind2 ho imparato che queste funzioni devono essere attivati ​​utilizzando methods:::bind_activation per sostituire rbind e cbind dalla base.

ho inserito la chiamata nel file del pacchetto R/zzz.R utilizzando la funzione di .onLoad:

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

Questo funziona come previsto. Tuttavia, l'esecuzione CMD R controllare ora sto ottenendo il seguente nota dal momento che sto utilizzando una funzione da non esportare nei metodi:

* 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. 

Come posso liberarmi della nota e qual è il modo corretto di definire i metodi cbind e rbind per le classi S4 in un pacchetto?

+0

Ti dispiacerebbe includere le definizioni di classe (ad esempio 'setClass (" ClassA ", ...)') di un paio delle classi S4 per cui stai cercando di aggiungere i metodi 'rbind' e' cbind'? Sarebbe più facile elaborare una soluzione per il tuo problema. – nrussell

+1

Le definizioni di classe non dovrebbero essere importanti in questo caso poiché si tratta solo di selezione/dispacciamento del metodo. Quindi potresti usare qualsiasi definizione come setClass ("ClassA", representation (a = "numerico")). – user625626

+0

Inoltre, potresti spiegare perché "* ... non sembra possibile definire rbind e cbind direttamente come metodi S4 ... *" - magari aggiungere il codice dal tentativo di implementarlo? – nrussell

risposta

4

penso che fondamentalmente la pagina di aiuto cBind nel pacchetto Matrix è stata accurata storicamente, ma non di recente. Ecco una classe

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

Non c'è generica, quindi crearne uno, dispacciamento sulla '...' argomento (vedi ?setMethod e ?dotsMethods)

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

quindi implementare un metodo

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

E infine usarlo

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

Questo va bene fintanto che gli argomenti '...' sono la stessa (possibilmente derivata) classe, che è spesso abbastanza buona.

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

credo che bind_activation() ha effetti globali, non solo alla spedizione nel pacchetto; dovrebbe essere evitato (non è più usato nel pacchetto Matrix, per esempio).

Inoltre, penso che questo è stato aggiornato in R-devel


r67699 | Lawrence | 2015-02-01 10:13:23 -0800 (dom, 01 feb 2015) 4 linee

cbind/rbind ora delegare ricorsivo a cbind2 (rbind2) quando almeno un argomento è un oggetto S4 e S3 spedizione fallisce; considerare anche l'ereditarietà di S4 durante l'invio S3 nelle funzioni * bind.

Problemi correlati