Comando R para configurar el directorio de trabajo en la ubicación del archivo fuente en Rstudio


135

Estoy trabajando en algunos tutoriales en R. Cada código R está contenido en una carpeta específica. Hay archivos de datos y otros archivos allí. Quiero abrir el .rarchivo y obtenerlo de forma tal que no tenga que cambiar el directorio de trabajo en Rstudio como se muestra a continuación:

ingrese la descripción de la imagen aquí

¿Hay alguna manera de especificar mi directorio de trabajo automáticamente en R.


Esto es probablemente un engaño. ver?setwd ?getwd
Brandon Bertelsen


3
No es un engaño, el póster quiere loadarchivos .rdata en la misma carpeta, no sourcecon el directorio de trabajo establecido en la ruta del archivo de origen.
Ruben

Respuestas:


76

Para obtener la ubicación de un script que se obtiene, puede usar utils::getSrcDirectoryo utils::getSrcFilename. Entonces, cambiar el directorio de trabajo al del archivo actual se puede hacer con:

setwd(getSrcDirectory()[1])

Esto no funciona en rstudio si ejecuta el código en lugar de Fuente ing ella. Para eso, necesitas usar rstudioapi::getActiveDocumentContext.

setwd(dirname(rstudioapi::getActiveDocumentContext()$path))

Esta segunda solución requiere que esté utilizando RStudio como su IDE, por supuesto.


su propia respuesta en stackoverflow.com/a/35842176/1247080 funciona (aunque uno debe incluir el nombre de directorio). Lo agregué
Stat-R el

No funciona para mi Me saleError: 'getActiveDocumentContext' is not an exported object from 'namespace:rstudioapi'
Andru

2
Tenga en cuenta que cuando ejecuta getActiveDocumentContext()en la consola dentro de RStudio, la ruta se informa como ''. Sin embargo, si ejecuta la línea de código en la parte del editor, se ejecutará como se esperaba. Esto puede abordar el comentario de @Andru
Megatron

1
@giac_man Parece que está utilizando una versión muy antigua del rstudioapipaquete. Intenta actualizar a la última.
Richie Cotton

1
@mjs En la parte superior de la consola, debería ver el directorio de trabajo actual. A la derecha de eso hay una pequeña flecha. Haga clic en eso para mostrar el directorio de trabajo actual en el navegador de archivos.
Richie Cotton

62

Sé que esta pregunta está desactualizada, pero también estaba buscando una solución para eso y Google lo enumera en la parte superior:

this.dir <- dirname(parent.frame(2)$ofile)
setwd(this.dir)

coloque eso en algún lugar del archivo (lo mejor sería el comienzo, sin embargo), para que el wd cambie de acuerdo con ese archivo.

Según los comentarios, esto podría no funcionar necesariamente en todas las plataformas (Windows parece funcionar, Linux / Mac para algunos). Tenga en cuenta que esta solución es para 'abastecer' los archivos, no necesariamente para ejecutar fragmentos en ese archivo.

vea también get filename y path of `source`d file


99
tampoco funcionó para mí:Error in dirname(parent.frame(2)$ofile) : a character vector argument expected
tumultous_rooster

44
El mismo problema aquí que @Matt O'Brien en Linux.
patapouf_ai

3
Funciona perfectamente si se obtiene.
m-dz

2
Me funcionó en RStudio v1.0.143 en Windows 10. Si selecciona "Fuente al guardar", funcionará bien (puede imprimir el directorio detectado con "cat"). Si selecciona las líneas y luego las ejecuta, el resultado es nulo.
Contango

2
Esto funciona para mí en una Mac cuando busca un archivo. Sin embargo, como señaló anteriormente @Contango, no funcionará al ejecutar el código de forma interactiva al resaltar un fragmento y presionar Comando + Retorno. En este caso, dado que no está buscando un archivo, no hay un archivo fuente desde el que extraer el directorio de trabajo. La respuesta no necesita especificar advertencias específicas de la plataforma.
bmosov01

7
dirname(rstudioapi::getActiveDocumentContext()$path)

funciona para mí, pero si no quieres usar rstudioapi y no estás en un proyecto, puedes usar el símbolo ~ en tu camino. El símbolo ~ se refiere al directorio de trabajo predeterminado de RStudio (al menos en Windows).

Opciones de RStudio

Si su directorio de trabajo de RStudio es "D: / Documents", setwd("~/proyect1")es el mismo que setwd ("D: / Documents / proyect1").

Una vez que se establece, puede navegar a un subdirectorio: read.csv("DATA/mydata.csv"). Es lo mismo que read.csv("D:/Documents/proyect1/DATA/mydata.csv").

Si desea navegar a una carpeta principal, puede usar "../". Por ejemplo: read.csv("../olddata/DATA/mydata.csv")que es lo mismo queread.csv("D:/Documents/oldata/DATA/mydata.csv")

Esta es la mejor manera para mí de codificar scripts, sin importar qué computadora esté usando.



6

Para rstudio , puede configurar automáticamente su directorio de trabajo en el directorio de script usando rstudioapi así:

library(rstudioapi)

# Getting the path of your current open file
current_path = rstudioapi::getActiveDocumentContext()$path 
setwd(dirname(current_path ))
print( getwd() )

Esto funciona al ejecutar o fuente su archivo.

Primero debe instalar el paquete rstudioapi. Observe que imprimo la ruta para estar 100% seguro de que estoy en el lugar correcto, pero esto es opcional.


Error en setwd (dirname (current_path)): no se puede cambiar el directorio de trabajo
tavalendo

@helmo verifica que tu usuario tenga permiso de escritura en el directorio de destino.
gagarine

5

La solución

dirname(parent.frame(2)$ofile)

no funciona para mi

Estoy usando un algoritmo de fuerza bruta, pero funciona:

File <- "filename"
Files <- list.files(path=file.path("~"),recursive=T,include.dirs=T)
Path.file <- names(unlist(sapply(Files,grep,pattern=File))[1])
Dir.wd <- dirname(Path.file)

Más fácil al buscar un directorio:

Dirname <- "subdir_name"
Dirs <- list.dirs(path=file.path("~"),recursive=T)
dir_wd <- names(unlist(sapply(Dirs,grep,pattern=Dirname))[1])

1
El problema con esta solución es que es muy lento. La búsqueda de todos los archivos y el almacenamiento en una variable también ocupa mucha memoria.
tavalendo

4

Si trabajas en Linux puedes probar esto:

setwd(system("pwd", intern = T) )

Esto funciona para mi.


1
Esto solo da su directorio de inicio (donde comienza su shell).
Caner

Da la ruta al directorio donde está el script que ejecuta.
Taz

2
pwd significa directorio de trabajo actual. Esto establecerá el directorio en el directorio actual del shell.
PeterVermont

pwdtambién funciona en PowerShell (que actualmente se considera el shell predeterminado en Windows), donde es un alias Get-Location.
BroVic

3

Estaba buscando una solución a este problema, vine a esta página. Sé que está anticuado, pero las soluciones anteriores eran insatisfactorias o no funcionaban para mí. Aquí está mi trabajo si está interesado.

filename = "your_file.R"
filepath = file.choose()  # browse and select your_file.R in the window
dir = substr(filepath, 1, nchar(filepath)-nchar(filename))
setwd(dir)

¿Hay alguna razón por la que no solo usas setwd( dirname(filepath) )?
jodis

3

Me doy cuenta de que este es un hilo viejo, pero tuve un problema similar con la necesidad de configurar el directorio de trabajo y no pude conseguir que ninguna de las soluciones funcionara para mí. Esto es lo que funcionó, en caso de que alguien más se encuentre con esto más adelante:

# SET WORKING DIRECTORY TO CURRENT DIRECTORY:
system("pwd=`pwd`; $pwd 2> dummyfile.txt")
dir <- fread("dummyfile.txt")
n<- colnames(dir)[2]
n2 <- substr(n, 1, nchar(n)-1)
setwd(n2)

Es un poco complicado, pero básicamente usa comandos del sistema para obtener el directorio de trabajo y guardarlo en dummyfile.txt, luego R lee ese archivo usando data.table :: fread. El resto es simplemente limpiar lo que se imprimió en el archivo para que me quede solo la ruta del directorio.

Necesitaba ejecutar R en un clúster, por lo que no había forma de saber en qué directorio terminaría (a los trabajos se les asigna un número y un nodo de cálculo). Esto hizo el truco para mí.


2

Entiendo que esto está desactualizado, pero no pude lograr que las respuestas anteriores funcionaran de manera muy satisfactoria, por lo que quería contribuir con mi método en caso de que alguien más encuentre el mismo error mencionado en los comentarios a la respuesta de BumbleBee.

El mío se basa en un simple comando del sistema. Todo lo que alimenta la función es el nombre de su script:

extractRootDir <- function(x) {
    abs <- suppressWarnings(system(paste("find ./ -name",x), wait=T, intern=T, ignore.stderr=T))[1];
    path <- paste("~",substr(abs, 3, length(strsplit(abs,"")[[1]])),sep="");
    ret <- gsub(x, "", path);
    return(ret);
}

setwd(extractRootDir("myScript.R"));

La salida de la función se vería así "/Users/you/Path/To/Script". Espero que esto ayude a cualquiera que se haya quedado atascado.


1

El herepaquete proporciona la here()función, que devuelve el directorio raíz del proyecto en función de algunas heurísticas.

No es la solución perfecta, ya que no encuentra la ubicación del script, pero es suficiente para algunos propósitos, así que pensé en ponerlo aquí.


1
Gracias por esta respuesta La ubicación de la secuencia de comandos actual se puede aprovechar al hacer una llamada a here::set_here()la fuente.
BroVic

0

La mayoría de las GUI suponen que si está en un directorio y "abre", hace doble clic o intenta ejecutar un archivo .R, el directorio en el que reside será el directorio de trabajo a menos que se especifique lo contrario. La GUI de Mac proporciona un método para cambiar ese comportamiento predeterminado que se puede cambiar en el panel de Inicio de Preferencias que establezca en una sesión en ejecución y que entre en vigencia en el próximo "inicio". También deberías estar mirando:

?Startup

La documentación de RStudio dice:

"Cuando se inicia a través de una asociación de archivos, RStudio establece automáticamente el directorio de trabajo en el directorio del archivo abierto". La configuración predeterminada es que RStudio se registre como un controlador para archivos .R, aunque también se menciona la posibilidad de establecer una "asociación" predeterminada con RStudio para extensiones .Rdata y .R. No puedo decir si tener el estado de 'controlador' y el estado de 'asociación' son los mismos en Linux.

http://www.rstudio.com/ide/docs/using/workspaces


44
Seguro que RStudio no hace esa suposición.
nico

1
Se comporta como lo describí en mi máquina. No he hecho nada especial para las preferencias de RStudio.
IRTFM

2
No hace eso en Linux :)
nico

2
"Cuando se inicia a través de una asociación de archivos" es la condición clave aquí. Algunas personas podrían estar iniciando Rstudio a través de un acceso directo o un comando en la terminal. Debe abrir el archivo y tener el valor predeterminado para abrir archivos .R es Rstudio. Si abre Rstudio primero (luego abra el archivo) no funcionará como se describe. A través de una asociación de archivos, la respuesta anterior funciona en Windows y Mac (posiblemente no Linux como @nico señala, pero no puedo verificar esto ya que no tengo una máquina Linux).
WetlabStudent

0
dirname(parent.frame(2)$ofile)  

tampoco funciona para mí, pero lo siguiente (como se sugiere en https://stackoverflow.com/a/35842176/992088 ) funciona para mí en ubuntu 14.04

dirname(rstudioapi::getActiveDocumentContext()$path)

1
Error: 'getActiveDocumentContext' is not an exported object from 'namespace:rstudioapi'también en Ubuntu 14.04
Rich Scriven

Tal vez pueda intentar instalar el paquete rstudioapi primero.
Lamothy

Eso es extraño. Estoy usando R-3.2.4 en un ubuntu 14.04 de 32 bits. Espero que no sea por el sistema operativo o las diferentes versiones de R.
Lamothy

0

En caso de que use codificación UTF-8:

path <- rstudioapi::getActiveDocumentContext()$path
Encoding(path) <- "UTF-8"
setwd(dirname(path))

Necesita instalar el paquete rstudioapi si aún no lo ha hecho.


Error en setwd (dirname (ruta)): no se puede cambiar el directorio de trabajo
tavalendo

`` `` Error en setwd (dirname (ruta)): no se puede cambiar el directorio de trabajo`` su solución no funciona, verifique su respuesta
Mr S Coder

0

Aquí hay otra forma de hacerlo:

set2 <- function(name=NULL) {
  wd <- rstudioapi::getSourceEditorContext()$path
  if (!is.null(name)) {
    if (substr(name, nchar(name) - 1, nchar(name)) != '.R') 
      name <- paste0(name, '.R')
  }
  else {
    name <- stringr::word(wd, -1, sep='/')
  }
  wd <- gsub(wd, pattern=paste0('/', name), replacement = '')
  no_print <- eval(expr=setwd(wd), envir = .GlobalEnv)
}
set2()
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.