¿Cuál es una forma de gestionar las routes a los files locales fuera de un repository de git sin el desorder de los conflictos de las diferentes routes en las máquinas de los queueboradores?

Colaboro regularmente en proyectos de análisis de datos grandes usando git y software estadístico como R. Debido a que los sets de datos son muy grandes y pueden cambiar al volver a downloadlos, no los guardamos en el repository. Si bien nos gusta diseñar las versiones finales de los scripts que desarrollamos para usar los arguments de command-line para leer las routes a los datasets brutos, es más fácil probarlos y depurarlos leyendo directamente los files en el entorno R. A medida que desarrollamos, por lo tanto, terminamos con líneas tales como

something = read.raw.file("path/to/file/on/my/machine") #something = read.raw.file("path/to/file/on/collaborators/machine") #something = read.raw.file("path/to/file/on/other/collaborators/machine") 

abarrotando el código.

Debe haber una mejor manera. Intenté agregar un file que cada secuencia de commands lee antes de ejecutar, como

 proj-config.local path.to.raw.file.1 = "/path/to/file/on/my/machine" 

y agregarlo a .gitignore , pero esta es una solución "pesada" dada la cantidad de time que lleva, y para los queueboradores no es obvio que uno hace eso o que deberían, o podrían nombrar o ubicar el file de manera diferente (ya que es ignorado) entonces la línea compartida de código que lee ese file termina mal, etc. etc.

¿Hay una mejor manera de gestionar las routes / references locales externas de repositorys?

PD. No noté nada que abordara este problema en ninguna de estas consultas relacionadas:

  1. Flujo de trabajo para el análisis estadístico y la networkingacción de informes
  2. organización del proyecto con R
  3. ¿Qué mejores prácticas usas para progtwigr en R?
  4. ¿Cómo se combina "Control de revisión" con "Flujo de trabajo" para R?
  5. ¿Cómo se compara el desarrollo de software con la progtwigción / análisis estadístico?
  6. Habilidades esenciales de un Científico de Datos
  7. Garantizar la reproducibilidad en un entorno R
  8. R y control de versión para el analist de datos solo

Una solución que he estado usando es build en el concepto de una ruta de búsqueda que se puede usar para localizar files. En una aplicación en particular, he incorporado la capacidad de anular la ruta de búsqueda con una variable de entorno, similar a la variable PATH comúnmente utilizada.

Escribí una function, findFileInPath (abajo) que searchá la ruta suministrada y devolverá la que se encuentre. Toma un vector de ruta y le permite separar las piezas de un determinado personaje, como normalmente lo hace un sistema operativo.

Podrías usarlo así: (como ejemplo solamente)

 DataSearchPath = c( "path/to/file/on/my/machine", "path/to/file/on/collaborators/machine", "path/to/file/on/other/collaborators/machine", Sys.getenv('DATASEARCHPATH') ) DataFilename = "data_file.csv" DataPathname = findFileInPath(DataFilename, path=DataSearchPath)[1] # Take the first one if (is.na(DataPathname)) { stop(paste("Cannot find data file", DataFilename), call.=FALSE) } ... 

Utilizo algo así para ubicar files en el source , localizar files de configuration, sets de datos, etc. Tengo múltiples routes diferentes, algunas de ellas expuestas en el entorno o varios files de configuration, otras son solo internas. Funciona bastante bien

En el ejemplo anterior, la variable de entorno DATASEARCHPATH se puede establecer (fuera de R) en una serie de routes separadas por puntos para search.

Mi implementación de findFileInPath toma por defecto la búsqueda de la variable de entorno PATH del sistema, separada por el carácter de dos puntos. (Esto probablemente no sea aplicable a Windows. Solo uso esto en Mac y Linux).

 #' findFileInPath: Locates files by searching the supplied paths #' #' @param filename character: the name of the file to search for #' #' @param path character: the path to search, either a vector, or optionally #' separated by \code{sep}. #' #' @param sep character: the separator character used to split \code{path} #' into multiple components. #' findFileInPath = function(filename, path=c('.',Sys.getenv('PATH')), sep=':') { # List all potential files, and return only those which exist. files = data.frame(name=file.path(unlist(strsplit(path, sep)), filename), stringsAsFactors=FALSE) files$exist = file.exists(files$name) files[files$exist==TRUE,1] } 

Me encontré con algo similar cuando trabajaba en el mismo repository desde dos plataforms diferentes, mientras almacenaba files de datos fuera del repository en cada máquina. Una cosa que puede hacer es conseguir que todos guarden los files en un lugar específico relacionado con el directory de trabajo del proyecto.

Con ese conocimiento, puede build la ruta al inicio de cada session. Por ejemplo:

 path <- strsplit(getwd(), "project_directory")[[1]] path <- file.path(path, "data_directory", "file") something <- read.raw.file(path) 

strsplit devuelve una list, por lo que tomar el primer elemento de esa list le da la ruta hasta el padre del directory de su proyecto. Si sus datos están en /data_directory dentro del directory principal de su proyecto, file.path construye una ruta de file independiente de la plataforma, a less que se especifique lo contrario (el argumento fsep pnetworkingeterminada en .Platform$file.sep ).