Si es posible, configure los parámetros que difieren entre series/ejecuciones/experimentos en un archivo de parámetros externo. Luego, puede obtener el código, llamar a una función e incluso utilizar un paquete, pero las operaciones están determinadas por un pequeño conjunto de parámetros definidos externamente.
Por ejemplo, JSON funciona muy bien para esto y los paquetes RJSONIO
y rjson
le permiten cargar el archivo en una lista. Supongamos que lo carga en una lista llamada parametersNN.json. Un ejemplo es el siguiente:
{
"Version": "20110701a",
"Initialization":
{
"indices": [1,2,3,4,5,6,7,8,9,10],
"step_size": 0.05
},
"Stopping":
{
"tolerance": 0.01,
"iterations": 100
}
}
Guardar como que "parameters01.json" y la carga como:
library(RJSONIO)
Params <- fromJSON("parameters.json")
y ya está fuera de funcionamiento. (NB: me gusta usar #s de versiones únicas dentro de mis archivos de parámetros, solo para poder identificar el conjunto más tarde, si estoy mirando la lista de "parámetros" dentro de R.) Simplemente llame a su script y apunte a los parámetros archivo, por ejemplo:
Rscript --vanilla MyScript.R parameters01.json
entonces, dentro del programa, identificar el archivo de parámetros de la función commandArgs()
.
Más adelante, puede dividir el código en funciones y paquetes, pero esta es probablemente la forma más fácil de generalizar un script de vanilla a corto plazo, y es una buena práctica a largo plazo, ya que el código debe separarse a partir de la especificación de los parámetros run/dataset/experiment-dependent.
Editar: para ser más precisos, incluso podría especificar directorios de entrada y salida o archivos (o nombres de patrones/prefijos) en el JSON. Esto deja muy claro cómo un conjunto de parámetros condujo a un determinado conjunto de resultados. Todo en el medio es solo código que se ejecuta con una parametrización dada, pero el código no debería cambiar mucho, ¿o sí?
Actualización: tres meses, y muchos miles de pistas, más sabia que mi respuesta anterior, yo diría que el almacenamiento externo de los parámetros en JSON es útil para 1-1000 carreras diferentes. Cuando los parámetros o configuraciones se cuentan por miles y más, es mejor cambiar a usar una base de datos para la administración de la configuración. Cada configuración puede originarse en un JSON (o XML), pero ser capaz de lidiar con diferentes diseños de parámetros requiere una solución de mayor escala, para lo cual una base de datos como SQLite (a través de RSQLite
) es una buena solución.
Me doy cuenta de que esta respuesta es excesiva para la pregunta original: cómo repetir el trabajo solo un par de veces, con algunos cambios de parámetros, pero al escalar cientos o miles de cambios de parámetros en la investigación en curso, necesario. :)
+1 porque solo lo hará dos veces más. La respuesta también depende de cuánto va a cambiar cada vez que realiza el análisis, solo unos pocos parámetros, datos de entrada,? Encuentro que a menudo hay una transición bastante suave entre (1) extraer los parámetros clave y definirlos en la parte superior del código [o ponerlos en un archivo separado y 'fuente()' ing del cuerpo del análisis] y (2) envolviendo el cuerpo del código en una función. No está claro para mí cuáles son las diferencias entre tu padre y tu entorno funcional. –
+1 Esto es más o menos lo que hice al final. Envolví todo el parámetro que cambió para cada ejecución en una lista. Luego creó diferentes listas (con la misma estructura) que contienen los valores de entrada para cada ejecución.Para cada iteración, copié las listas necesarias y guardé las variables resultantes en listas de salida. En otras palabras, un poco de envoltura de código en un preámbulo y limpieza, y trabajo hecho. Funciona. Está bien si es feo ... – Andrie