2012-01-16 10 views
5

Sono perplesso dall'erroreR utilizzando metodi S3 e S4 di simulare nello stesso pacchetto

found an S4 version of 'simulate' so it has not been imported correctly 

Ho scritto un pacchetto R che include una definizione di un metodo di simulazione() come metodo S3. Poiché il generico per la simulazione è già definito, definisco semplicemente una classe simulate.my (simulate.fitContinuous nel mio caso).

Il pacchetto dipende anche da un altro pacchetto che ha una versione S4 di simulazione. Quando carico il mio pacchetto, ottengo l'errore di versione S4 sopra. Non sono sicuro di cosa stia producendo l'errore.

riproducibile esempio afferrando la package from github, o fare

require(devtools) 
install_github("pmc", "cboettig") 
require(pmc) 

Per riprodurre questo errore da zero: Creare un nuovo pacchetto con file di descrizione minima. includere le importazioni DESCRIZIONE: ahi. Crea un NAMESPACE e aggiungi le importazioni (ahi) e S3method (simula, prova). Creare la directory R, ​​aggiungere il uno script R banale (documentazione roxygen ho incluso che genera lo spazio dei nomi che ho appena detto, ma questo errore può anche essere creato senza devtools/roxygen):

#' simulate 
#' 
#' a test for s3/s4 conflicts 
#' @param object who cares? 
#' @param nsim guess. 
#' @param seed yup 
#' @param ... other parameters we will just ignore 
#' @return something 
#' @method simulate test 
#' @S3method simulate test 
#' @import ouch 
simulate.test <- function(object, nsim = 1, seed = NULL, ...){ 
    message("This test worked") 
} 

Installa il pacchetto (documento con devtools prima se lo desideri) e ottieni l'errore.

La mia soluzione migliore finora è eliminare la linea S3method dal NAMESPACE ed esportare invece la funzione completa simulate.test. Questo passerà il controllo e l'installazione senza avvisi, ma è chiaramente una soluzione inferiore.

Una soluzione diversa è di avere a che fare tanto quanto le importazioni e documentare correttamente il metodo S3 (come sopra). Quindi tutto funziona come previsto, ma il messaggio di avviso rimane.

+0

Si noti che l'utilizzo dipende invece delle importazioni e il mantenimento della riga S3method (simula, prova) non genera errori, ma non genera nemmeno il comportamento corretto. – cboettig

risposta

4

simulate è un S3 generico definito stats, così secondo la sezione 1.6.2 di "scrittura R Estensioni" (l'esempio non è chiaro - ci sono delle eccezioni per i prodotti generici definiti nel base) file NAMESPACE dovrebbe avere

importFrom(stats, simulate) 
S3method(simulate, fitContinuous) 

l'attività di "trovato un metodo di S4" sembra riflettere quando il problema è stato scoperto - cercando di aggiungere metodi S4 a un S3 generico che non era visibile (il "si" Credo che si riferisce il generico simulate).

+0

il pacchetto "ouch" che viene importato nel mio namespace rende statistiche un metodo s4, che mi sta dando questo errore. Prova showMethods ("simula") senza caricare ouch, e ti viene detto che non è un metodo s4. caricare la libreria (ahi); showMethods ("simula") e quindi simulare ora è un metodo S4. Non sei sicuro di come aggirare questo problema, il messaggio di errore s4 persiste. – cboettig

+0

La mia risposta sembra non essere corretta e non ho una soluzione immediata; scusa per l'informazione sbagliata. Immagino che un work-around sarebbe di importare selettivamente da ouch (e non importare simulare), o definire un metodo S4 sulla simulazione, ma nessuno di questi dovrebbe essere necessario, IMO. –

+0

Hmm. Il pacchetto ouch già definisce un metodo simula s4. Ho bisogno di usare il metodo di simulazione di quel pacchetto, quindi importarlo non è un'opzione ... – cboettig