2015-04-19 20 views
7

Ho una classe contenitore che è fondamentalmente una lista. Poiché volevo supportare il subsetting, ho sovraccaricato il sottoinsieme [ operator (probabilmente implementato male).Il sovraccarico dell'operatore smette di funzionare nel pacchetto R

#' Constructor for spectra object 
.spectra = function(n_spectrum = 0) { 
    object  = vector(mode = "list", n_spectrum) 
    class(object) = "spectra" 
    return(object) 
} 

#' Operator overload 
#' @export 
`[.spectra` = function(x, i) { 
    x = unclass(x) 
    x = x[i]     # Using the list's subset function 
    class(x) = "spectra" 
    return(x)     # Should return a "spectra" object, not a list 
} 

Ora, questo funziona come previsto quando nel mio ambiente di sviluppo (quando eseguo il debug del pacchetto). Cioè, se y_old è un oggetto spectra e io faccio y_new = y_old[-1], y_new è ancora un oggetto spectra.

Tuttavia, quando compilo il progetto come un pacchetto e installarlo, l'operatore subsetting restituisce un list invece di un oggetto spectra.

Qualsiasi indizio di cosa sta succedendo?

EDIT

ho dimenticato di dire che sto usando RStudio e la biblioteca devtools.

+2

Avete una riga con 'S3method (" [", spectra)' nel file 'NAMESPACE' del pacchetto? – nicola

+0

@nicola No. La ** sola ** linea che ho in 'NAMESPACE' è' exportPattern ("^ [[: alpha:]] +") ', che immagino sia ciò che RStudio inserisce lì. – dudu

+0

Metti questa linea, ricostruisci il pacchetto e verifica se funziona. – nicola

risposta

0

Questo problema si riduce all'inizializzazione predefinita di RStudio di NAMESPACE quando si sceglie di creare un pacchetto. Ispezione del file namespace rivela:

exportPattern("^[[:alpha:]]+") 

che non corrisponde l'operatore sottoinsieme [, come MrFlick sottolineato.

È possibile aggiungere nomi a NAMESPACE manualmente oppure è possibile fare in modo che RStudio e Roxygen eseguano il lavoro. In RStudio 0.99.902 si farebbe:

  1. install.packages("roxygen2")
  2. check generare la documentazione con Roxygen nel menu Costruire> Configura creare strumenti>strumenti di compilazione.
  3. Fare clic sul pulsante Configure e selezionare la casella di controllo NAMESPACE file.

Ora è ovviamente aggiungere la documentazione Roxygen alle funzioni e ricordarsi di utilizzare il tag @export, ad es .:

#' Print hi in R 
#' @export 
print_hi = function(x) print("hi") 

Dopo aver costruito si dovrebbe avere un file namespace generato automaticamente. Ad esempio:

# Generated by roxygen2: do not edit by hand 

export(print_hi) 
Problemi correlati