2014-09-30 16 views
5

Desidero condividere alcuni software come pacchetto ma alcuni dei miei script non sembrano funzionare in modo molto naturale come funzioni. Ad esempio, considera il seguente blocco di codice in cui "raw.df" è un frame di dati contenente variabili di tipi sia discreti che continui. Le funzioni 'count.unique' e 'squash' saranno definite nel pacchetto. Lo script divide il frame dei dati in due frame, 'cat.df' per essere trattato come dati categoriali e 'cts.df' per essere trattato come dati continui.Includere gli script R nei pacchetti R

La mia idea di come questo sarebbe usato è che l'utente avrebbe letto nel frame dati 'raw.df', fonte lo script, quindi modifica interattivamente 'cat.df' e 'cts.df', magari combinando un po ' categorie e trasformando alcune variabili.

dcutoff <- 9 
tail(raw.df) 
(nvals <- apply(raw.df, 2, count.unique)) 
p <- dim(raw.df)[2] 
(catvar <- (1:p)[nvals <= dcutoff]) 
p.cat <- length(catvar) 
(ctsvar <- (1:p)[nvals > dcutoff]) 
p.cts <- length(ctsvar) 
cat.df <- raw.df[ ,catvar] 
for (i in 1:p.cat) cat.df[ ,i] <- squash(cat.df[ ,i]) 
head(cat.df) 
for(i in 1:p.cat) { 
    cat(as.vector(table(cat.df[ ,i])), "\n") 
}  
cts.df <- raw.df[ ,ctsvar] 
for(i in 1:p.cts) { 
    cat(quantile(cts.df[ ,i], probs = seq(0, 1, 0.1)), "\n") 
} 

Ora, questo potrebbe, naturalmente, essere trasformato in una funzione che restituisce una lista contenente nvals, p, p.cat, cat.df, ecc; comunque questo mi sembra piuttosto brutto. Tuttavia, l'unica possibilità di includere script in un pacchetto sembra essere la cartella "demo" che non sembra essere la strada giusta da percorrere. Consigli su come procedere sarebbero stati ricevuti con gratitudine.

(Ma la gratitudine non essere espressa formalmente come sembra che l'uso di un commento per esprimere il ringraziamento è deprecato.)

+2

Io uso 'inst/scripts /', ma anche rendere il file un vero e proprio (eseguibile) via rscript o più piccolo. –

+2

Perché la funzione che restituisce quelle quantità ti sembra brutta? È perché non sarebbe stampato nello stesso modo in cui lo hai nella sceneggiatura? Potresti creare la tua funzione di stampa personalizzata per fare quella parte ... – Dason

+0

Dirk: conosci un pacchetto che utilizza questo approccio? –

risposta

4

E 'meglio per incapsulare il codice in una funzione. Non è brutto restituire una lista, per esempio gli oggetti S3 sono solo un elenco con una classe di attributo .

object <- list(attribute.name = something, ..) 
class(object) <- "cname" 
return (object) 

È inoltre possibile utilizzare la cartella inst (come indicato nel commento Dirk), in quanto il contenuto della inst sottodirectory verranno copiati in modo ricorsivo nella directory di installazione.

  1. si crea una cartella di inst:

    inst 
    ----scripts 
        some_scripts.R 
    
  2. si può chiamare da una funzione nel pacchetto e utilizzare system.file meccanismo per caricarlo.

    load_myscript <- function(){ 
        source(system.file(package='your_pkg_name','scripts/some_scripts.R')) 
    } 
    
  3. si chiami come qualsiasi altra funzione nel pacchetto: lo script

    load_myscript() 
    
+0

Lo controllerò. –