para - r-studio full
Obtener el camino del script actual (5)
Actualización agosto 2018
TLDR : el paquete here ayuda a crear una ruta desde la carpeta raíz del proyecto, sin importar en qué parte de la carpeta busque los scripts de R o los documentos de Rmd.
El paquete here permanece disponible en CRAN. La versión de desarrollo se ha movido a github.com/r-lib/here . Los puntos mencionados en los sitios citados a continuación siguen siendo válidos.
Respuesta anterior
Lea la Oda al paquete aquí :
¿Tiene usted: setwd () en sus scripts? POR FAVOR DEJA DE HACER ESO. Esto hace que su script sea muy frágil, conectado a una sola vez y lugar. Tan pronto como renombras o mueves directorios, se rompe. O tal vez tienes una nueva computadora? O tal vez alguien más necesita ejecutar su código?
[...]
Presentación clásica de problemas: incomodidad en la creación de rutas y / o configuración de directorios de trabajo en proyectos con subdirectorios. Especialmente si usa R Markdown y knitr, lo que hace que muchas personas con su comportamiento predeterminado de "directorio de trabajo = directorio donde vive este archivo". [...]
Instala el paquete here :
install.packages("here")
library(here)
here()
here("construct","a","path")
Documentación de la función here()
:
Comenzando con el directorio de trabajo actual durante el tiempo de carga del paquete, aquí se moverá hacia arriba la jerarquía de directorios hasta que encuentre un directorio que satisfaga al menos una de las siguientes condiciones:
- contiene un archivo que coincide [.] Rproj $ con contenido que coincide con ^ Versión: en la primera línea
- [... otras opciones ...]
- contiene un directorio .git
Una vez establecido, el directorio raíz no cambia durante la sesión activa de R. Aquí () luego agrega los argumentos al directorio raíz.
La versión de desarrollo del paquete aquí está disponible en github .
Me gustaría establecer el directorio de trabajo en la ruta del script actual mediante programación, pero primero necesito obtener la ruta del script actual.
Así que me gustaría poder hacer:
current_path = ...retrieve the path of current script ...
setwd(current_path)
Hasta ahora he intentado:
initial.options <- commandArgs(trailingOnly = FALSE)
file.arg.name <- "--file="
script.name <- sub(file.arg.name, "", initial.options[grep(file.arg.name, initial.options)])
script.basename <- dirname(script.name)
script.name devuelve NULL
source("script.R", chdir = TRUE)
Devuelve : Error en el archivo (nombre de archivo, "r", codificación = codificación): no se puede abrir la conexión Además: Mensaje de advertencia: en archivo (nombre de archivo, "r", codificación = codificación): no se puede abrir el archivo ''/script.R'' : El fichero o directorio no existe
dirname(parent.frame(2)$ofile)
Devuelve : Error en dirname (parent.frame (2) $ ofile): se esperaba un argumento de vector de caracteres ... porque parent.frame es nulo
frame_files <- lapply(sys.frames(), function(x) x$ofile)
frame_files <- Filter(Negate(is.null), frame_files)
PATH <- dirname(frame_files[[length(frame_files)]])
Devuelve : Nulo porque frame_files es una lista de 0
thisFile <- function() {
cmdArgs <- commandArgs(trailingOnly = FALSE)
needle <- "--file="
match <- grep(needle, cmdArgs)
if (length(match) > 0) {
# Rscript
return(normalizePath(sub(needle, "", cmdArgs[match])))
} else {
# ''source''d via R console
return(normalizePath(sys.frames()[[1]]$ofile))
}
}
Devuelve : Error en path.expand (ruta): argumento ''ruta'' no válido
También vi todas las respuestas desde here , here , here y here . Sin alegría.
Trabajando con RStudio 1.1.383
EDITAR: Sería genial si no hubiera necesidad de una biblioteca externa para lograr esto.
En RStudio, puede obtener la ruta al archivo que se muestra actualmente en el panel de origen usando
rstudioapi::getSourceEditorContext()$path
Si solo quieres el directorio, usa
dirname(rstudioapi::getSourceEditorContext()$path)
Si desea el nombre del archivo que se ha ejecutado por source(filename)
, es un poco más difícil. srcfile
buscar la variable srcfile
algún lugar de la pila. ¿Qué tan atrás depende de cómo escribes las cosas, pero es alrededor de 4 pasos atrás? Por ejemplo,
fi <- tempfile()
writeLines("f()", fi)
f <- function() print(sys.frame(-4)$srcfile)
source(fi)
fi
Debería imprimir lo mismo en las dos últimas líneas.
Otra opción para obtener la ruta del script actual es funr::get_script_path()
y no necesita ejecutar su script usando RStudio.
Si está ejecutando un Rscript a través de la línea de comandos, etc.
Rscript /path/to/script.R
La siguiente función asignará este this_file
a /path/to/script
library(tidyverse)
get_this_file <- function(){
commandArgs() %>%
tibble::as.tibble() %>%
tidyr::separate(col=value, into=c("key", "value"), sep="=", fill=''right'') %>%
dplyr::filter(key == "--file") %>%
dplyr::pull(value)
}
this_file <- get_this_file()
Actualización de marzo de 2019
Basado en las respuestas de Alexis Lucattini y user2554330, para que funcione tanto en la línea de comandos como en RStudio. También resolviendo el mensaje desaprobado "as_tibble"
library(tidyverse)
getCurrentFileLocation <- function()
{
this_file <- commandArgs() %>%
tibble::enframe(name = NULL) %>%
tidyr::separate(col=value, into=c("key", "value"), sep="=", fill=''right'') %>%
dplyr::filter(key == "--file") %>%
dplyr::pull(value)
if (length(this_file)==0)
{
this_file <- rstudioapi::getSourceEditorContext()$path
}
return(dirname(this_file))
}