qué - rutas absolutas y relativas linux
R: obtención de archivos utilizando una ruta relativa (1)
Después de una discussion con @hadley en GitHub, me di cuenta de que mi pregunta va en contra de los patrones de desarrollo comunes en R.
Parece que en los archivos R que se originan a menudo se supone que el directorio de trabajo ( getwd()
) se establece en el directorio en el que se encuentran. Para que esto funcione, source
tiene un argumento chdir
cuyo valor predeterminado es FALSE
. Cuando se establece en TRUE
, cambiará el directorio de trabajo al directorio del archivo que se está obteniendo.
En resumen:
Supongamos que la
source
siempre es relativa porque el directorio de trabajo del archivo que se está obteniendo se establece en el directorio donde está el archivo.Para que esto funcione, siempre configure
chdir=T
cuandosource(''lib/stats/big_stats.R'', chdir=T)
archivos de otro directorio, por ejemplo,source(''lib/stats/big_stats.R'', chdir=T)
.
Para el abastecimiento conveniente de directorios completos de una manera predecible escribí sourceDir
, que los archivos de fuentes en un directorio en orden alfabético.
sourceDir <- function (path, pattern = "//.[rR]$", env = NULL, chdir = TRUE)
{
files <- sort(dir(path, pattern, full.names = TRUE))
lapply(files, source, chdir = chdir)
}
La obtención de archivos utilizando una ruta relativa es útil cuando se trata de grandes bases de código. Otros lenguajes de programación tienen mecanismos bien definidos para buscar archivos usando una ruta relativa al directorio del archivo al que se está enviando. Un ejemplo es Ruby''s require_relative
. ¿Cuál es una buena manera de implementar el origen de ruta relativa en R?
A continuación se muestra lo que reconstruí hace un tiempo usando varias recetas y publicaciones en el foro R. Me ha funcionado bien para el desarrollo directo pero no es robusto. Por ejemplo, se rompe cuando los archivos se cargan a través de la biblioteca testthat
, específicamente auto_test()
. rscript_stack()
devuelve el character(0)
.
# Returns the stack of RScript files
rscript_stack <- function() {
Filter(Negate(is.null), lapply(sys.frames(), function(x) x$ofile))
}
# Returns the current RScript file path
rscript_current <- function() {
stack <- rscript_stack()
r <- as.character(stack[length(stack)])
first_char <- substring(r, 1, 1)
if (first_char != ''~'' && first_char != .Platform$file.sep) {
r <- file.path(getwd(), r)
}
r
}
# Sources relative to the current script
source_relative <- function(relative_path, ...) {
source(file.path(dirname(rscript_current()), relative_path), ...)
}
¿Conoces una mejor implementación source_relative
?