A menudo me encuentro escribiendo scripts R que generan una gran cantidad de resultados. Me parece más limpio poner esta salida en su propio directorio (s). Lo que he escrito a continuación verificará la existencia de un directorio y se moverá a él, o creará el directorio y luego se moverá a él. ¿Hay una mejor manera de abordar esto?
mainDir <- "c:/path/to/main/dir"
subDir <- "outputDirectory"
if (file.exists(subDir)){
setwd(file.path(mainDir, subDir))
} else {
dir.create(file.path(mainDir, subDir))
setwd(file.path(mainDir, subDir))
}
setwd()
en el código R, básicamente elimina la idea de usar un directorio de trabajo porque ya no puede mover fácilmente su código entre computadoras..bat
archivo que el usuario final nunca tendrá que modificar.setwd
trabajar con rutas de red. Solo necesita proporcionar rutas para guardar resultados y seguir trabajando con la ruta actual (aquella que se estableció cuando se inició la sesión R). O comience R con el directorio de trabajo deseado.out_dir <- "path/to/output/directory"
y luego usarwrite.table(file = file.path(out_dir,"table_1.csv"), ...)
. O inclusoout_file <- function(fnm) file.path("path/to/output/directory", fnm)
y luegowrite.table(file = out_file("table_1.csv"), ...)
(método similar que uso cuando trabajo con unidades de red).Respuestas:
Uso
showWarnings = FALSE
:dir.create()
no se bloquea si el directorio ya existe, solo imprime una advertencia. Entonces, si puede vivir viendo advertencias, no hay problema con solo hacer esto:fuente
showWarnings = FALSE
que esto también ocultará otras advertencias, como que el directorio no se pueda crear.dir.create("test1/test2/test3/", recursive=TRUE)
?suppressWarnings(<statement>)
suprimirá las advertencias solo por esa declaración.A partir del 16 de abril de 2015, con el lanzamiento de
R 3.2.0
hay una nueva función llamadadir.exists()
. Para usar esta función y crear el directorio si no existe, puede usar:Esto devolverá
FALSE
si el directorio ya existe o no es creíble, yTRUE
si no existía pero se creó con éxito.Tenga en cuenta que para verificar simplemente si el directorio existe, puede usar
fuente
ifelse()
para ramificaciones no vectorizadas.|
lugar de escalar||
. Funciona pero es una mala práctica.|
, ¿es la vectorización la razón por la que a veces no funciona||
? Sé que esto está fuera de tema, pero estoy demasiado ansioso por descubrirlo. Definitivamente iré y leeré más sobre vectorización. Graciasifelse
?En términos de arquitectura general, recomendaría la siguiente estructura con respecto a la creación de directorios. Esto cubrirá la mayoría de los problemas potenciales y la
dir.create
llamada detectará cualquier otro problema con la creación del directorio .También tenga en cuenta que si
~/foo
no existe, la llamada adir.create('~/foo/bar')
fallará a menos que usted especifiquerecursive = TRUE
.fuente
Aquí está la verificación simple , y crea el directorio si no existe:
fuente
El uso de file.exists () para probar la existencia del directorio es un problema en la publicación original. Si subDir incluye el nombre de un archivo existente (en lugar de solo una ruta), file.exists () devolvería VERDADERO, pero la llamada a setwd () fallaría porque no puede configurar el directorio de trabajo para que apunte a un archivo.
Recomendaría el uso de file_test (op = "- d", subDir), que devolverá "TRUE" si subDir es un directorio existente, pero FALSO si subDir es un archivo existente o un archivo o directorio inexistente. Del mismo modo, la comprobación de un archivo se puede lograr con op = "- f".
Además, como se describe en otro comentario, el directorio de trabajo es parte del entorno R y debe ser controlado por el usuario, no por un script. Los scripts deberían, idealmente, no cambiar el entorno R. Para solucionar este problema, podría usar options () para almacenar un directorio disponible globalmente donde quisiera toda mi salida.
Entonces, considere la siguiente solución, donde someUniqueTag es solo un prefijo definido por el programador para el nombre de la opción, lo que hace improbable que ya exista una opción con el mismo nombre. (Por ejemplo, si estaba desarrollando un paquete llamado "filer", podría usar filer.mainDir y filer.subDir).
El siguiente código se usaría para establecer opciones que están disponibles para su uso posterior en otros scripts (evitando así el uso de setwd () en un script), y para crear la carpeta si es necesario:
Luego, en cualquier script posterior que necesite manipular un archivo en subDir, puede usar algo como:
Esta solución deja el directorio de trabajo bajo el control del usuario.
fuente
Tuve un problema con R 2.15.3 por el cual al intentar crear una estructura de árbol de forma recursiva en una unidad de red compartida recibía un error de permiso.
Para evitar esta rareza, creo manualmente la estructura;
fuente
Un trazador de líneas:
if (!dir.exists(output_dir)) {dir.create(output_dir)}
Ejemplo:
fuente
Para averiguar si una ruta es un directorio válido, intente:
file.info
no le importa una barra al final.file.exists
en Windows fallará para un directorio si termina en una barra diagonal y tiene éxito sin él. Por lo tanto, esto no se puede usar para determinar si una ruta es un directorio.fuente
dir.create()
parte)? ¿Las afirmaciones son incorrectas o simplemente no se consideran útiles para resolver la pregunta en cuestión?