Se possibile, impostare i parametri che differiscono tra set/avvia/esperimenti in un file di parametri esterno. Quindi, è possibile generare il codice, chiamare una funzione, persino utilizzare un pacchetto, ma le operazioni sono determinate da un piccolo insieme di parametri definiti esternamente.
Ad esempio, JSON funziona molto bene e i pacchetti RJSONIO
e rjson
consentono di caricare il file in un elenco. Supponi di caricarlo in una lista chiamata parametersNN.json. Un esempio è il seguente:
{
"Version": "20110701a",
"Initialization":
{
"indices": [1,2,3,4,5,6,7,8,9,10],
"step_size": 0.05
},
"Stopping":
{
"tolerance": 0.01,
"iterations": 100
}
}
Salva che come "parameters01.json" e carico:
library(RJSONIO)
Params <- fromJSON("parameters.json")
e sei fuori e in esecuzione. (NB: Mi piace usare la versione unica #s nei miei file di parametri, solo per poter identificare il set in un secondo momento, se guardo l'elenco "parametri" all'interno di R.) Basta chiamare il tuo script e puntare ai parametri file, ad esempio:
Rscript --vanilla MyScript.R parameters01.json
poi, all'interno del programma, identificare il file parametri dalla funzione commandArgs()
.
Successivamente, è possibile suddividere il codice in funzioni e pacchetti, ma questo è probabilmente il modo più semplice per rendere uno script vanilla generalizzabile a breve termine ed è una buona pratica a lungo termine, poiché il codice dovrebbe essere separato dalla specifica dei parametri run/dataset/speriment-dependent.
Modifica: per essere più precisi, vorrei anche specificare le directory oi file di input e output (o i nomi/i prefissi di nomi) nel JSON. Ciò rende molto chiaro come un set di parametri abbia portato a un particolare set di output. Tutto ciò che sta in mezzo è solo il codice che viene eseguito con una determinata parametrizzazione, ma il codice non dovrebbe davvero cambiare molto, dovrebbe?
Aggiornamento: Tre mesi, e molte migliaia di piste, più saggio di mia risposta precedente, direi che l'archiviazione esterna dei parametri in JSON è utile per 1-1000 sedute diverse. Quando il numero di parametri o configurazioni è compreso tra migliaia e sopra, è meglio passare all'utilizzo di un database per la gestione della configurazione. Ogni configurazione può avere origine in un JSON (o XML), ma essere in grado di affrontare diversi layout di parametri richiede una soluzione su scala più ampia, per la quale un database come SQLite (via RSQLite
) è una soluzione eccellente.
Mi rendo conto che questa risposta è eccessiva per la domanda originale: come ripetere il lavoro solo un paio di volte, con alcune modifiche ai parametri, ma quando si ridimensionano a centinaia o migliaia di modifiche ai parametri nella ricerca in corso, sono disponibili strumenti più ampi necessario. :)
+1 perché lo farai solo altre due volte. La risposta dipende anche da quanto cambierai ogni volta attraverso l'analisi: solo pochi parametri, dati di input,? Trovo che ci sia spesso una transizione abbastanza fluida tra (1) estrarre i parametri chiave e definirli nella parte superiore del codice [o metterli in un file separato e 'source()' nel corpo dell'analisi] e (2) avvolgere il corpo del codice in una funzione. Non mi è chiaro quali sono le distinzioni tra ambiente principale e funzione del genitore. –
+1 Questo è praticamente quello che ho fatto alla fine. Ho avvolto tutto il parametro che è cambiato per ogni corsa in un elenco. Quindi ha creato diversi elenchi (con la stessa struttura) contenenti i valori di input per ogni esecuzione.Per ogni iterazione, ho copiato gli elenchi necessari e salvato le variabili risultanti in elenchi di output. In altre parole, un po 'di wrapping di codice in un preambolo e pulizia, e lavoro svolto. Funziona. Va bene se è brutto ... – Andrie