|
| 1 | +--- |
| 2 | +title: Gestión de proyectos con RStudio |
| 3 | +teaching: 20 |
| 4 | +exercises: 10 |
| 5 | +source: Rmd |
| 6 | +--- |
| 7 | + |
| 8 | +::::::::::::::::::::::::::::::::::::::: objectives |
| 9 | + |
| 10 | +- Crear proyectos independientes en RStudio |
| 11 | + |
| 12 | +:::::::::::::::::::::::::::::::::::::::::::::::::: |
| 13 | + |
| 14 | +:::::::::::::::::::::::::::::::::::::::: questions |
| 15 | + |
| 16 | +- ¿Cómo puedo gestionar mis proyectos en R? |
| 17 | + |
| 18 | +:::::::::::::::::::::::::::::::::::::::::::::::::: |
| 19 | + |
| 20 | + |
| 21 | + |
| 22 | +## Introducción |
| 23 | + |
| 24 | +El proceso científico es naturalmente incremental, y la vida de muchos proyectos comienza como notas aleatorias, algún código, luego un manuscrito, y |
| 25 | +eventualmente todo está mezclado. |
| 26 | + |
| 27 | +<blockquote class="twitter-tweet"><p>Managing your projects in a reproducible fashion doesn't just make your science reproducible, it makes your life easier.</p>— Vince Buffalo (@vsbuffalo) <a href="https://twitter.com/vsbuffalo/status/323638476153167872">April 15, 2013</a></blockquote> |
| 28 | +<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script> |
| 29 | + |
| 30 | +La mayoría de la gente tiende a organizar sus proyectos de esta manera: |
| 31 | + |
| 32 | + |
| 33 | + |
| 34 | +Hay muchas razones de por qué debemos **siempre** evitar esto: |
| 35 | + |
| 36 | +1. Es realmente difícil saber cuál versión de tus datos es |
| 37 | + la original y cuál es la modificada. |
| 38 | +2. Es muy complicado porque se mezclan archivos con varias |
| 39 | + extensiones juntas. |
| 40 | +3. Probablemente te lleve mucho tiempo encontrar realmente |
| 41 | + cosas, y relacionar las figuras correctas con el código exacto |
| 42 | + que ha sido utilizado para generarlas. |
| 43 | + |
| 44 | +Un buen diseño del proyecto finalmente hará tu vida más fácil: |
| 45 | + |
| 46 | +- Ayudará a garantizar la integridad de tus datos. |
| 47 | +- Hace que sea más simple compartir tu código con alguien más |
| 48 | + (un compañero de laboratorio, colaborador o supervisor). |
| 49 | +- Permite cargar fácilmente tu código junto con el envío de tu manuscrito. |
| 50 | +- Hace que sea más fácil retomar un proyecto después de un descanso. |
| 51 | + |
| 52 | +## Una posible solución |
| 53 | + |
| 54 | +Afortunadamente hay herramientas y paquetes que pueden ayudarte a gestionar tu trabajo con efectividad. |
| 55 | + |
| 56 | +Uno de los aspectos más poderosos y útiles de RStudio es su funcionalidad de gestión de proyectos. Lo utilizaremos hoy para crear un proyecto autocontenido y reproducible. |
| 57 | + |
| 58 | +::::::::::::::::::::::::::::::::::::::: challenge |
| 59 | + |
| 60 | +## Desafío: Creando un proyecto autocontenido |
| 61 | + |
| 62 | +Vamos a crear un proyecto en RStudio: |
| 63 | + |
| 64 | +1. Hacer clic en el menú "File", luego en "New Project". |
| 65 | +2. Hacer clic en "New Directory". |
| 66 | +3. Hacer clic en "Empty Project". |
| 67 | +4. Introducir el nombre del directorio para guardar tu proyecto, por ejemplo: "my\_project". |
| 68 | +5. Si está disponible, seleccionar la casilla de verificación "Create a git repository." |
| 69 | +6. Hacer clic en el botón "Create Project". |
| 70 | + |
| 71 | + |
| 72 | +:::::::::::::::::::::::::::::::::::::::::::::::::: |
| 73 | + |
| 74 | +Ahora cuando inicies R en este directorio de proyectos, o abras este proyecto con RStudio, todo nuestro trabajo estará completamente autocontenido en este directorio. |
| 75 | + |
| 76 | +## Buenas prácticas para la organización del proyecto |
| 77 | + |
| 78 | +Aunque no existe una "mejor" forma de diseñar un proyecto, existen algunos principios |
| 79 | +generales que deben cumplirse para facilitar su gestión: |
| 80 | + |
| 81 | +### Tratar los datos como de sólo lectura |
| 82 | + |
| 83 | +Este es probablemente el objetivo más importante al configurar un proyecto. Los datos |
| 84 | +suelen consumir mucho tiempo y/o ser costosos de recolectar. Trabajar con ellos en un formato en el que pueden ser modificados (por ejemplo, en Excel) significa que nunca estás seguro de donde provienen, o cómo han sido modificados desde su recolección. |
| 85 | +Por lo tanto, es una buena idea manejar tus datos como de "sólo lectura". |
| 86 | + |
| 87 | +### Limpieza de datos |
| 88 | + |
| 89 | +En muchos casos tus datos estarán "sucios" y necesitarán un preprocesamiento significativo |
| 90 | +para obtener un formato R (o cualquier otro lenguaje de programación) que te resulte útil. Esta |
| 91 | +tarea es algunas veces llamada **"data munging"**. Es útil almacenar estos **scripts** en una carpeta separada y crear una segunda carpeta de datos de "sólo lectura" para contener los **datasets** "limpios". |
| 92 | + |
| 93 | +### Tratar la salida generada como descartable |
| 94 | + |
| 95 | +Todo lo generado por tus **scripts** debe tratarse como descartable: todo debería |
| 96 | +poder regenerarse a partir de tus **scripts**. |
| 97 | + |
| 98 | +Hay muchas diferentes maneras de gestionar esta salida. Es útil |
| 99 | +tener una carpeta de salida con diferentes subdirectorios para cada análisis |
| 100 | +por separado. Esto hace que sea más fácil después, ya que muchos de nuestros análisis son exploratorios |
| 101 | +y no terminan siendo utilizados en el proyecto final, y algunos de los análisis se comparten entre proyectos. |
| 102 | + |
| 103 | +::::::::::::::::::::::::::::::::::::::::: callout |
| 104 | + |
| 105 | +## Tip: Good Enough Practices for Scientific Computing |
| 106 | + |
| 107 | +[Good Enough Practices for Scientific Computing](https://github.com/swcarpentry/good-enough-practices-in-scientific-computing/blob/gh-pages/good-enough-practices-for-scientific-computing.pdf) brinda las siguientes recomendaciones para la organización de proyectos: |
| 108 | + |
| 109 | +1. Coloque cada proyecto en su propio directorio, el cual lleva el nombre del proyecto. |
| 110 | +2. Coloque documentos de texto asociados con proyecto en el directorio `doc`. |
| 111 | +3. Coloque los datos sin procesar y los metadatos en el directorio `data`, y archivos generados durante la limpieza y análisis en el directorio `results` . |
| 112 | +4. Coloque los **scripts** fuente del proyecto y los programas en el directorio `src`, y programas traídos de otra parte o compilados localmente en el directorio `bin`. |
| 113 | +5. Nombre todos archivos de tal manera que reflejen su contenido o función. |
| 114 | + |
| 115 | +:::::::::::::::::::::::::::::::::::::::::::::::::: |
| 116 | + |
| 117 | +::::::::::::::::::::::::::::::::::::::::: callout |
| 118 | + |
| 119 | +## Tip: ProjectTemplate - una posible solución |
| 120 | + |
| 121 | +Una manera de automatizar la gestión de un proyecto es instalar el paquete `ProjectTemplate`. |
| 122 | +Este paquete configurará una estructura de directorios ideal para la gestión de proyectos. |
| 123 | +Esto es muy útil ya que te permite tener tu **pipeline/workflow** de análisis organizado y estructurado. |
| 124 | +Junto con la funcionalidad predeterminada del proyecto RStudio y Git, podrás realizar el seguimiento de tu |
| 125 | +trabajo y compartirlo con colaboradores. |
| 126 | + |
| 127 | +1. Instala `ProjectTemplate`. |
| 128 | +2. Carga la librería. |
| 129 | +3. Inicializa el proyecto: |
| 130 | + |
| 131 | + |
| 132 | +``` r |
| 133 | +install.packages("ProjectTemplate") |
| 134 | +library("ProjectTemplate") |
| 135 | +create.project("../my_project", merge.strategy = "allow.non.conflict") |
| 136 | +``` |
| 137 | + |
| 138 | +Para más información de ProjectTemplate y su functionalidad visita la |
| 139 | +página [ProjectTemplate](https://projecttemplate.net/index.html). |
| 140 | + |
| 141 | + |
| 142 | +:::::::::::::::::::::::::::::::::::::::::::::::::: |
| 143 | + |
| 144 | +### Separar la definición de funciones y la aplicación |
| 145 | + |
| 146 | +Una de las maneras más efectivas de trabajar con R es comenzar escribiendo el código que deseas que se ejecute directamente en un **script** .R, y enseguida ejecutar las líneas seleccionadas (ya sea utilizando los atajos del teclado en RStudio o haciendo clic en el botón "Run") en la consola interactiva de R. |
| 147 | + |
| 148 | +Cuando tu proyecto se encuentra en sus primeras etapas, el archivo **script** inicial .R generalmente contendrá muchas líneas de código ejecutadas directamente. Conforme vaya madurando, fragmentos reutilizables podrán ser llevados a sus |
| 149 | +propias funciones. Es buena idea separar estas funciones en dos carpetas separadas; una |
| 150 | +para guardar funciones útiles que reutilizarás a través del análisis y proyectos, y |
| 151 | +una para guardar los **scripts** de análisis. |
| 152 | + |
| 153 | +::::::::::::::::::::::::::::::::::::::::: callout |
| 154 | + |
| 155 | +## Tip: Evitando la duplicación |
| 156 | + |
| 157 | +Puedes encontrarte utilizando datos o **scripts** de análisis a través de varios proyectos. |
| 158 | +Normalmente, deseas evitar la duplicación para ahorrar espacio y evitar |
| 159 | +actualizar el código en múltiples lugares. |
| 160 | + |
| 161 | +En este caso, es útil hacer "links simbólicos", los cuales son esencialmente |
| 162 | +accesos directos a archivos en otro lugar en un sistema de archivos. En Linux y OS X puedes |
| 163 | +utilizar el comando `ln -s`, y en Windows crear un acceso directo o |
| 164 | +utilizar el comando `mklink` desde la terminal de Windows. |
| 165 | + |
| 166 | + |
| 167 | +:::::::::::::::::::::::::::::::::::::::::::::::::: |
| 168 | + |
| 169 | +### Guardar los datos en el directorio de datos |
| 170 | + |
| 171 | +Ahora que tenemos una buena estructura de directorios colocaremos/guardaremos los archivos de datos en el directorio `data/`. |
| 172 | + |
| 173 | +::::::::::::::::::::::::::::::::::::::: challenge |
| 174 | + |
| 175 | +## Desafío 1 |
| 176 | + |
| 177 | +Descargar los datos gapminder de [aquí](https://raw.githubusercontent.com/resbaz/r-novice-gapminder-files/master/data/gapminder-FiveYearData.csv). |
| 178 | + |
| 179 | +1. Descargar el archivo (CTRL + S, clic botón derecho del ratón -> "Guardar como...", o Archivo -> "Guardar página como...") |
| 180 | +2. Asegúrate de que esté guardado con el nombre `gapminder-FiveYearData.csv` |
| 181 | +3. Guardar el archivo en la carpeta `data/` dentro de tu proyecto. |
| 182 | + |
| 183 | +Más delante cargaremos e inspeccionaremos estos datos. |
| 184 | + |
| 185 | + |
| 186 | +:::::::::::::::::::::::::::::::::::::::::::::::::: |
| 187 | + |
| 188 | +::::::::::::::::::::::::::::::::::::::: challenge |
| 189 | + |
| 190 | +## Desafío 2 |
| 191 | + |
| 192 | +Es útil tener una idea general sobre el **dataset**, directamente desde la |
| 193 | +línea de comandos, antes de cargarlo en R. Comprender mejor el **dataset** |
| 194 | +será útil al tomar decisiones sobre cómo cargarlo en R. Utiliza la terminal de |
| 195 | +línea de comandos para contestar las siguientes preguntas: |
| 196 | + |
| 197 | +1. ¿Cuál es el tamaño del archivo? |
| 198 | +2. ¿Cuántas líneas de datos contiene? |
| 199 | +3. ¿Cuáles tipos de valores están almacenados en este archivo? |
| 200 | + |
| 201 | +::::::::::::::: solution |
| 202 | + |
| 203 | +## Solución al desafío 2 |
| 204 | + |
| 205 | +Al ejecutar estos comandos en la terminal: |
| 206 | + |
| 207 | + |
| 208 | +``` sh |
| 209 | +ls -lh data/gapminder-FiveYearData.csv |
| 210 | +``` |
| 211 | + |
| 212 | +``` output |
| 213 | +-rw-r--r-- 1 runner runner 80K Nov 11 00:47 data/gapminder-FiveYearData.csv |
| 214 | +``` |
| 215 | + |
| 216 | +El tamaño del archivo es 80K. |
| 217 | + |
| 218 | + |
| 219 | +``` sh |
| 220 | +wc -l data/gapminder-FiveYearData.csv |
| 221 | +``` |
| 222 | + |
| 223 | +``` output |
| 224 | +1705 data/gapminder-FiveYearData.csv |
| 225 | +``` |
| 226 | + |
| 227 | +Hay 1705 líneas. Los datos se ven así: |
| 228 | + |
| 229 | + |
| 230 | +``` sh |
| 231 | +head data/gapminder-FiveYearData.csv |
| 232 | +``` |
| 233 | + |
| 234 | +``` output |
| 235 | +country,year,pop,continent,lifeExp,gdpPercap |
| 236 | +Afghanistan,1952,8425333,Asia,28.801,779.4453145 |
| 237 | +Afghanistan,1957,9240934,Asia,30.332,820.8530296 |
| 238 | +Afghanistan,1962,10267083,Asia,31.997,853.10071 |
| 239 | +Afghanistan,1967,11537966,Asia,34.02,836.1971382 |
| 240 | +Afghanistan,1972,13079460,Asia,36.088,739.9811058 |
| 241 | +Afghanistan,1977,14880372,Asia,38.438,786.11336 |
| 242 | +Afghanistan,1982,12881816,Asia,39.854,978.0114388 |
| 243 | +Afghanistan,1987,13867957,Asia,40.822,852.3959448 |
| 244 | +Afghanistan,1992,16317921,Asia,41.674,649.3413952 |
| 245 | +``` |
| 246 | + |
| 247 | +::::::::::::::::::::::::: |
| 248 | + |
| 249 | +:::::::::::::::::::::::::::::::::::::::::::::::::: |
| 250 | + |
| 251 | +::::::::::::::::::::::::::::::::::::::::: callout |
| 252 | + |
| 253 | +## Tip: Línea de comandos en R Studio |
| 254 | + |
| 255 | +Puedes abrir rápidamente una terminal en RStudio usando la opción del menú **Tools -> Shell...**. |
| 256 | + |
| 257 | + |
| 258 | +:::::::::::::::::::::::::::::::::::::::::::::::::: |
| 259 | + |
| 260 | +### Control de versiones |
| 261 | + |
| 262 | +Es importante llevar a cabo el control de versiones en un proyecto. Ve [aquí](https://swcarpentry.github.io/git-novice-es/14-supplemental-rstudio/) para una buena lección donde se describe el uso de Git con R Studio. |
| 263 | + |
| 264 | + |
| 265 | + |
| 266 | +:::::::::::::::::::::::::::::::::::::::: keypoints |
| 267 | + |
| 268 | +- Usar RStudio para crear y gestionar proyectos con un diseño consistente. |
| 269 | +- Tratar los datos brutos como de sólo lectura. |
| 270 | +- Tratar la salida generada como disponible. |
| 271 | +- Definición y aplicación de funciones separadas. |
| 272 | + |
| 273 | +:::::::::::::::::::::::::::::::::::::::::::::::::: |
| 274 | + |
| 275 | + |
0 commit comments