working trabajo studio ruta funciones fijar directorio como comandos carpeta cambiar r setwd

studio - ¿Cómo configurar la ubicación actual del archivo como el directorio de trabajo predeterminado en la programación de R?



setwd en r (4)

Quiero hacer la ubicación actual del archivo como el directorio de trabajo.

Utilizando Rstudio (Funciona!):

# Author : Bhishan Poudel # Program : writehere.r # Source : Rscript writehere.r # set working directory here this.dir <- dirname(parent.frame(2)$ofile) # frame(3) also works. setwd(this.dir) # Sample data to test this code mydata <- seq(1:10) write.csv(mydata,"writehere.dat") #This works flawlessly in MacOS 10.9 and Ubuntu 15.1.

Usando el comando desde la terminal: Rscript writehere.r (¡No funciona!)

Error in dirname(parent.frame(2)$ofile) : a character vector argument expected Execution halted ------------------ (program exited with code: 1)

Usando el comando desde la terminal: Rscript writehere.r (¡Funciona ahora!)

# Author : Bhishan Poudel # Program : writehere.r # Source : Rscript example.r # set working directory here this_dir <- function(directory) setwd( file.path(getwd(), directory) ) # Sample data to test this code mydata <- seq(1:10) write.csv(mydata,"writehere.dat")

Usando la función dentro de ~ / .Rprofile para Rstudio (Works!):,

############################################## # inside ~/.Rprofile # set up working directory setwd_thisdir <- function () { this.dir <- dirname(parent.frame(3)$ofile) setwd(this.dir) } ##############################################

Luego, en cualquier directorio, digamos que tengo un archivo writehere.r, ahora funciona.

# Author : Bhishan Poudel # Program : writehere.r # Compile : Rscript writehere.r # set working directory here setwd_thisdir # Sample data to test this code mydata <- seq(1:10) write.csv(mydata,"writehere.dat")

Pregunta: ¿Por qué la función?

this.dir <- dirname(parent.frame(2)$ofile) # frame(3) also works. setwd(this.dir)

¿No funciona para editores de texto que no sean Rstudio?

Algunos enlaces útiles son los siguientes:
R configuración de directorio de trabajo a la ubicación del archivo de origen?
Comando R para configurar el directorio de trabajo a la ubicación del archivo fuente
obtener el nombre de archivo y la ruta del archivo `source`d
setwd () en el directorio de trabajo actual
Comando para "Establecer directorio de trabajo en la ubicación del archivo fuente"
SublimeText y R: Configuración del directorio de archivos actual
Configuración del directorio de trabajo a través de una función.
¿Cuál es una manera infalible de configurar permanentemente el directorio de trabajo R?
R configuración de directorio de trabajo a la ubicación del archivo de origen?
¿Cómo entrar en el directorio de un archivo en R?


ACTUALIZACIÓN: Me di cuenta de que esta respuesta no ayudó en absoluto, y publicaré otra que haga el truco.

En la medida en que el código que desea ejecutar no necesite ningún argumento adicional, una solución tal como se describe a continuación, utilizando eval(expr, envir) podría ser la solución.

Considere el siguiente ejemplo usando print(environment()) , que debería devolver el environment: R_GlobalEnv cuando se usa en la línea de comandos. La función test_1 imprimirá información sobre el entorno interno que se crea cuando se llama a la función, mientras que la función test_2 devolverá el resultado deseado.

test_1 <- function(){ print(environment()) } test_2 <- function(){ .expr <- quote({ print(environment()) }) .envir <- sys.frame(which = -1) eval(expr = .expr, envir = .envir) }

El sys.frame(which = -1) garantiza que la expresión se evalúa en el entorno donde se llama la función. Si está seguro de que siempre desea utilizar el entorno global, es mejor utilizar .GlobalEnv . También es importante citar la expresión que desea utilizar, de lo contrario podría no funcionar como se desea.

Una buena característica de esta solución es que no necesita modificar el código que desea poner en la función, simplemente cítelo.

Finalmente: es posible extender este enfoque de modo que su función pueda tomar argumentos que luego se le asignarán al código que desea evaluar en otro entorno. Sin embargo, esto requerirá un poco de ajustes no triviales en la expresión que desea evaluar; es posible que deba usar la bquote + .() y, además, también debe usar call y do.call .


Escribo otra respuesta porque has cambiado tu pregunta. Hay dos hechos útiles:

  1. ofile es una variable en el entorno de la función de source , por lo que puede usarla solo cuando ejecuta algún script con la función de source .
  2. Cuando ejecuta un script desde el terminal, el directorio de trabajo se establece en el directorio actual en el terminal.

Entonces, para comentar tus observaciones:

  1. Utilizando Rstudio (Funciona!). Sí, si presiona Fuente (que usa la función de source ), pero no si presiona Ejecutar (que simplemente ejecuta los comandos en la consola R).
  2. Rscript writehere.r (¡No funciona!). Eso es porque estás buscando ofile sin una llamada a la source .
  3. Rscript writehere.r (¡Funciona ahora!). Sí, pero funciona solo por el hecho 2 : el código this_dir <- function(directory) setwd( file.path(getwd(), directory) ) es innecesario, ya que es solo la definición de una función llamada this_dir .
  4. Rstudio (funciona!). Primera parte: OK. Segunda parte. Funciona solo por hecho 2 . En particular, setwd_thisdir es innecesario porque simplemente imprime el cuerpo de setwd_thisdir en la consola.

En resumen, setwd(dirname(parent.frame(2)$ofile)) es un truco útil cuando setwd(dirname(parent.frame(2)$ofile)) un script con la función de source , pero no tiene acceso a las opciones de la función de source : por ejemplo, cuando presiona Fuente en R- Estudio. Cuando sea posible, use intead la función source con chdir=TRUE . Si ejecuta el formulario de script, el terminal simplemente establece el terminal en la carpeta de script.


Intenta usar parent.frame(3) en tu función:

setwd_thisdir <- function () { this.dir <- dirname(parent.frame(3)$ofile) setwd(this.dir) }

Consulte ?parent.frame o http://adv-r.had.co.nz/Environments.html#calling-environments .

También puede consultar la opción chdir de la función de source ( ?source ).


La primera respuesta que di fue que no entendía el punto por completo, ya que no había examinado de cerca lo que querías lograr. Sin embargo, la solución presentada aquí debería hacer el truco.

Primero, tenga en cuenta que la source tiene un argumento chdir que en el archivo de ayuda se describe con: lógico; si TRUE y file es una ruta de acceso, el directorio de trabajo R se cambia temporalmente al directorio que contiene el file para evaluar.

Especificar manualmente ese argumento cada vez que quiera generar un archivo sería una molestia, así que agreguemos algo a .Rprofile que cambie el valor predeterminado para chdir de FALSE a TRUE .

La función formals se puede usar para modificar un valor predeterminado, pero cuando se usa en una función que pertenece a otro entorno, el resultado será que se creará una copia local de la función. Eso no es lo suficientemente bueno.

Es probable que haya varias maneras de resolver esto, pero el siguiente pequeño truco de source sirvió cuando lo inserté en .Rprofile.

.temporary_copy_source <- base::source formals(.temporary_copy_source)$chdir <- TRUE utils::assignInNamespace( x = "source", value = .temporary_copy_source, ns = environment(source)) rm(.temporary_copy_source)

Una advertencia: el método presentado aquí puede, en principio, permitir a los usuarios modificar los valores predeterminados de cualquier argumento en cualquier función, pero sería una idea excepcionalmente mala. Tenga en cuenta que sus scripts podrían ser compartidos más adelante con alguien que no tenga el mismo perfil de .prod. Que usted. ¡Nunca escriba código que requiera tales modificaciones de los espacios de nombres!