studio - setting working directory r
¿Riesgos de usar setwd() en un script? (6)
Aunque los problemas con setwd () han sido seleccionados, me gustaría agregar uno más a la parte de cuáles son las alternativas de la pregunta. A menudo trabajamos con git donde el camino relativo es muy conveniente.
setrelwd <- function(rel_path){
curr_dir <- getwd()
abs_path <- file.path(curr_dir,rel_path)
if(dir.exists(abs_path)){
setwd(abs_path)
}
else
{
warning(''Directory does not exist. Please create it first.'')
}
}
> setrelwd("Summer2016")
Warning message:
In setrelwd("Summer2016") : Directory does not exist. Please create it first.
Además, si no desea ver el mensaje de advertencia, pero cree una carpeta de inmediato, consulte Verificar la existencia del directorio y cree si no existe
He oído decir que es una mala práctica usar setwd()
en un script.
- ¿Cuáles son los riesgos / peligros asociados con él?
- ¿Cuáles son las mejores alternativas?
Es un tema de código reproducible. Si especifica un directorio que no existe en la computadora de otra persona, entonces no pueden usar su código. Esto es particularmente malo con las rutas de archivo absolutas, y particularmente malo con las rutas de archivos de Windows (que son absolutamente imposibles de replicar en un sistema Unix).
Mi solución preferida es especificar que el usuario debe estar en el directorio correspondiente en su propio sistema antes de comenzar a ejecutar el código. Si para su propia conveniencia, desea colocar un setwd(...)
en la parte superior de su código, donde otras personas puedan notarlo y comentarlo según corresponda, pero el resto de su código asume solo las rutas relativas desde ese inicio directorio, eso está bien conmigo.
Yihui Xie (autor de knitr
) se siente particularmente fuerte sobre esto:
https://groups.google.com/forum/?fromgroups=#!topic/knitr/knM0VWoexT0
Cuando quiera manipular archivos, se supone que están en el mismo directorio de su fuente (por ejemplo, documentos Rnw). Entonces, siempre puedes usar rutas relativas y nunca necesitarás setwd (). El uso de setwd () contradice el principio de reproducibilidad, por ejemplo, usa setwd (''foo / bar /'') y es posible que el directorio no exista en las computadoras de otras personas. Consulte la Pregunta frecuente 7: https://github.com/yihui/knitr/blob/master/FAQ.md
Y a partir de las Preguntas Frecuentes 7 antes mencionadas:
Será mejor que no haga esto [cambiar el directorio de trabajo dentro de los fragmentos de código knitr]. Su directorio de trabajo siempre es getwd () (todos los archivos de salida se escribirán aquí), pero los fragmentos de código se evalúan en el directorio de donde proviene el documento de entrada. Cambiar directorios de trabajo mientras se ejecuta el código R es una mala práctica en general. Ver # 38 para una discusión. También debe tratar de evitar los directorios absolutos siempre que sea posible (use directorios relativos), porque hace que las cosas sean menos reproducibles.
Véase también: https://github.com/yihui/knitr/issues/38
Hacia las mejores alternativas pregunta:
Principalmente utilizo R para proyectos individuales (lo que significa que soy el analista principal). Sin embargo, los utilizamos en proyectos que a veces necesitan compartirse con otros.
RStudio - Proyectos
He encontrado que la funcionalidad de Proyectos de RStudio ayuda en gran medida a mantener sus archivos organizados. Si otros usuarios también adoptan RStudio, tendrán la agradable sensación de poder abrir un solo archivo ("* .Rproj") y cargar el proyecto en el mismo estado en que lo guardó por última vez.
ProjectTemplate
Además de esto, he encontrado una nueva herramienta, ProjectTemplate que va un paso más allá. La técnica que el autor desarrolló se utiliza para proporcionar estructura a lo que está haciendo. Por favor, vaya al sitio web para más detalles.
No puedo pensar en ningún problema en particular con el uso de setwd()
en un script que se ejecuta en un servidor que administro, ya que devuelve un error que puede interceptarse con try (), y usted puede administrarlo. He usado setwd()
cuando setwd()
perezoso con respecto a las rutas, ¡vea más abajo!
Uso file.path()
extensivamente en la producción de scripts o de otra manera. Trabajar a través de los archivos en un directorio de entrada y colocar los gráficos de salida y los informes en otro lugar. Así que algo parecido a ... (no probado) Esto sería un poco tedioso utilizando setwd()
.
kInDir <- ''~/Indir''
kOutDir <- ''~/Outdir''
flist <- dir(path=kInDir, pattern=''^[a-z]{2,5}//.csv$'')
# note I could have used full.names=T - but it''s easier not to...
for (fnam in flist) {
# full path to the report file created
sfnam <- file.path(kOutDir, gsub(''.csv'', ''_report.txt'', fnam))
# full path to the csv file that will be created
ofnam <- file.path(kOutDir, gsub(''.csv'', ''_b.csv'', fnam))
#
# ok... we''re going to process this CSV file...
r1 <- read.csv(file.path(kInDir, fnam))
#
# we''''ll put the output from the analysis into this report file
sink(sfnam, split=TRUE)
# processs it... into a new data.frame k1
# blah blah blah...
#
write.csv(k1, file=ofnam, row.names=FALSE)
sink() # turn off this particular report file
}
Para hacer las cosas un poco más portátiles donde trabajo, todos ponemos esto en un perfil de Rprofile
hdrive=
switch(Sys.info()[[1]],
''Linux''="/mnt/hdrive",
''Windows''="H:/",
"Darwin"="/Volumes/hdrive/mnt/hdrive"
)
Así que siempre tengo esa variable para llevarme a nuestro disco compartido. Entonces en mi guión podemos escribir
setwd(paste(hdrive,"/relative/path/",sep="/"))
Así que eso nos ayuda a solucionar algunos de los problemas de los que otros están hablando.
Yo personalmente agregué el siguiente código. Utilizo Sys.info () y any () con información única.
El primer paso es usar Sys.info () y encontrar el identificador único para su computadora.
if(any(Sys.info() == "COMPUTER1")) {
setwd("c:/Users/user1/repos/project/")
}
if(any(Sys.info() == "COMPUTER2")) {
setwd("home/user1/repos/project/")
}
y solo agregue el nombre de la computadora a la sentencia if y agregue la ruta correcta. Solo agregue un nuevo si para cada máquina.
Para la reproducción, no cambia el directorio de trabajo de nadie a menos que sea ese usuario específico.