Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
josschavezf committed Oct 29, 2024
1 parent db47eef commit 4b309bd
Show file tree
Hide file tree
Showing 18 changed files with 884 additions and 284 deletions.
261 changes: 259 additions & 2 deletions 02_sesion2.Rmd
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,263 @@ Instructora: Joselyn Chávez

[
```{r,echo=FALSE}
knitr::include_url("https://comunidadbioinfo.github.io/cdsb2023/solucion_problemas.html", height = "380px")
knitr::include_url("https://comunidadbioinfo.github.io/cdsb2024/creando_funciones.html", height = "380px")
```
](https://comunidadbioinfo.github.io/cdsb2023/solucion_problemas.html)
](https://comunidadbioinfo.github.io/cdsb2024/creando_funciones.html)

## Nombre de la función

- Cortos pero descriptivos
- Recomendable: Separar las palabras con _
- Establecer una palabra en común al inicio para familias de funciones

```{r, eval=FALSE}
use_bioc_citation() # es mejor que
citation()
bioc_cit()
usebioccitation()
useBiocCitation()
use.bioc.citation()
```

## Estructura de la función

- Indentar las líneas de código.
- Agregar comentarios para separar/describir las secciones importantes.
- Usar la sintaxis paquete::funcion() cuando hacemos llamado a funciones de otros paquetes.

```{r, eval=FALSE}
usethis::use_r("subset_heatmap")
```

Generemos el código de manera regular.

Simulemos una matriz con diversas mediciones y grafiquemos los datos en un heatmap.

```{r, message=FALSE, error=FALSE, fig.align='center'}
mi_matriz <- matrix(rnorm(100), nrow = 10)
rownames(mi_matriz) <- paste0("medicion_",letters[1:10])
colnames(mi_matriz) <- paste0("grupo_",letters[1:10])
library(ComplexHeatmap)
Heatmap(mi_matriz,
cluster_columns = FALSE,
heatmap_legend_param = list(title = "valores"))
```

Escribamos una función que permita seleccionar algunos grupos de interés y genere el heatmap.

No la mejor opción:

```{r, eval=FALSE}
library(ComplexHeatmap)
subset_heatmap <- function(x,mediciones=NULL,grupos=NULL) {
x_subset <- x[mediciones,grupos]
Heatmap(mi_matriz,
cluster_columns=FALSE,
heatmap_legend_param=list(title="valores"))
}
```

Un poco mejor:

```{r, eval=FALSE}
library(ComplexHeatmap)
subset_heatmap <- function(x, mediciones = NULL,
grupos = NULL) {
x_subset <- x[mediciones,grupos]
Heatmap(mi_matriz,
cluster_columns = FALSE,
heatmap_legend_param = list(title = "valores"))
}
```

Mucho mejor:

```{r, eval=FALSE}
subset_heatmap <- function(x, mediciones = NULL,
grupos = NULL) {
# subset matrix
x_subset <- x[mediciones, grupos]
# plot heatmap
ComplexHeatmap::Heatmap(
x_subset,
cluster_columns = FALSE,
heatmap_legend_param = list(title = "valores"))
}
```

Ejecutemos la función:

```{r, eval=FALSE}
subset_heatmap(
mi_matriz,
mediciones = c("medicion_a", "medicion_b", "medicion_c"),
grupos = c("grupo_d","grupo_e","grupo_f"))
```

## ¡Tu turno!

Escribe una función que:

- Filtre la matriz y mantenga sólo los valores por encima de cierto valor.
- Genere el heatmap filtrado.

Recuerda seguir las recomendaciones para escribir funciones.

## Argumentos

- Los argumentos deben tener un nombre descriptivo y bien documentado.

No la mejor opción:

```{r, eval=FALSE}
subset_heatmap <- function(x, m, g) {
# subset matrix
x_subset <- x[mediciones, grupos]
}
```

Una mejor opción:

```{r, eval=FALSE}
subset_heatmap <- function(x, mediciones,
grupos) {
# subset matrix
x_subset <- x[mediciones, grupos]
# plot heatmap
ComplexHeatmap::Heatmap(
x_subset,
cluster_columns = FALSE,
heatmap_legend_param = list(title = "valores"))
}
```

- Los argumentos generalmente deben tener valores default.

```{r, eval=FALSE}
subset_heatmap <- function(x, mediciones = NULL,
grupos = NULL, return_plot = TRUE) {
# subset matrix
x_subset <- x[mediciones, grupos]
# plot heatmap
ComplexHeatmap::Heatmap(
x_subset,
cluster_columns = FALSE,
heatmap_legend_param = list(title = "valores"))
}
```

- Evalúa la validez de los argumentos

```{r, eval=FALSE}
subset_heatmap <- function(x, mediciones = NULL,
grupos = NULL, return_plot = TRUE) {
stopifnot(is.matrix(x))
# subset matrix
x_subset <- x[mediciones, grupos]
# plot heatmap
heatmap <- ComplexHeatmap::Heatmap(
x_subset,
cluster_columns = FALSE,
heatmap_legend_param = list(title = "valores"))
if(return_plot == TRUE) {return(heatmap)}
}
```

Este código no debe funcionar:

```{r, eval=FALSE}
subset_heatmap(
as.data.frame(mi_matriz),
mediciones = c("medicion_a", "medicion_b", "medicion_c"),
grupos = c("grupo_d","grupo_e","grupo_f"))
```

Nota: Usa las funciones is() para evaluar la clase de los objects, no uses class() == ni class() !=.

- Proporciona pistas para entender los errores.

```{r, eval=FALSE}
subset_heatmap <- function(x, mediciones = NULL,
grupos = NULL, return_plot = TRUE) {
if(!is.matrix(x)) {stop("x debe ser una matriz")}
# subset matrix
x_subset <- x[mediciones, grupos]
# plot heatmap
heatmap <- ComplexHeatmap::Heatmap(
x_subset,
cluster_columns = FALSE,
heatmap_legend_param = list(title = "valores"))
if(return_plot == TRUE) {return(heatmap)}
}
```

Este código debe dar un error, más un mensaje de ayuda.

```{r, eval=FALSE}
subset_heatmap(
as.data.frame(mi_matriz),
mediciones = c("medicion_a", "medicion_b", "medicion_c"),
grupos = c("grupo_d","grupo_e","grupo_f"))
```

## ¡Tu turno!

- Agrega pasos de evaluación para los otros argumentos de la función.
- Incluye mensajes de ayuda cuando el formato de los argumentos no es el esperado.

## Indentación

- Usa 4 espacios para indentar, evita los tabs.
- No uses líneas de más de 80 caracteres.

## Uso de espacios

- Usa un espacio después de la coma: a, b, c.
- Usa espacio después de operadores binarios: a == b.

## Comentarios

- Usa “##” para comenzar las líneas de comentarios.
- Los comentarios deben usarse como notas y documentación solamente.
- No dejes código comentado que no se va a usar.
- Evita los TODO’s comentados cuando vayas a publicar el paquete.

## Mensajes para el usuario

Si deseas imprimir mensajes para el usuario, como el progreso del análisis en la función o advertir sobre los valores de los argumentos, evita el uso de cat(), mejor usa:

- message() comunica mensajes diagnóstico, como el progreso de la función.

```{r}
message("Paso 1: completo")
```

- warning() comunica situaciones inusuales que pueden ser manejadas por tu código.

```{r}
warning("El número de elementos esperados es mayor a uno, se tomará el primer valor del vector")
```

- stop() indica una condición errónea.

```{r, eval=FALSE}
stop("x debe ser numérico")
```

Binary file modified _main_files/figure-html/unnamed-chunk-61-1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
9 changes: 9 additions & 0 deletions docs/404.html
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,15 @@
<li class="chapter" data-level="5" data-path="creando-mis-primeras-funciones.html"><a href="creando-mis-primeras-funciones.html"><i class="fa fa-check"></i><b>5</b> Creando mis primeras funciones</a>
<ul>
<li class="chapter" data-level="5.1" data-path="creando-mis-primeras-funciones.html"><a href="creando-mis-primeras-funciones.html#diapositivas-4"><i class="fa fa-check"></i><b>5.1</b> Diapositivas</a></li>
<li class="chapter" data-level="5.2" data-path="creando-mis-primeras-funciones.html"><a href="creando-mis-primeras-funciones.html#nombre-de-la-función"><i class="fa fa-check"></i><b>5.2</b> Nombre de la función</a></li>
<li class="chapter" data-level="5.3" data-path="creando-mis-primeras-funciones.html"><a href="creando-mis-primeras-funciones.html#estructura-de-la-función"><i class="fa fa-check"></i><b>5.3</b> Estructura de la función</a></li>
<li class="chapter" data-level="5.4" data-path="creando-mis-primeras-funciones.html"><a href="creando-mis-primeras-funciones.html#tu-turno"><i class="fa fa-check"></i><b>5.4</b> ¡Tu turno!</a></li>
<li class="chapter" data-level="5.5" data-path="creando-mis-primeras-funciones.html"><a href="creando-mis-primeras-funciones.html#argumentos"><i class="fa fa-check"></i><b>5.5</b> Argumentos</a></li>
<li class="chapter" data-level="5.6" data-path="creando-mis-primeras-funciones.html"><a href="creando-mis-primeras-funciones.html#tu-turno-1"><i class="fa fa-check"></i><b>5.6</b> ¡Tu turno!</a></li>
<li class="chapter" data-level="5.7" data-path="creando-mis-primeras-funciones.html"><a href="creando-mis-primeras-funciones.html#indentación"><i class="fa fa-check"></i><b>5.7</b> Indentación</a></li>
<li class="chapter" data-level="5.8" data-path="creando-mis-primeras-funciones.html"><a href="creando-mis-primeras-funciones.html#uso-de-espacios"><i class="fa fa-check"></i><b>5.8</b> Uso de espacios</a></li>
<li class="chapter" data-level="5.9" data-path="creando-mis-primeras-funciones.html"><a href="creando-mis-primeras-funciones.html#comentarios"><i class="fa fa-check"></i><b>5.9</b> Comentarios</a></li>
<li class="chapter" data-level="5.10" data-path="creando-mis-primeras-funciones.html"><a href="creando-mis-primeras-funciones.html#mensajes-para-el-usuario"><i class="fa fa-check"></i><b>5.10</b> Mensajes para el usuario</a></li>
</ul></li>
<li class="chapter" data-level="6" data-path="documentación-de-funciones.html"><a href="documentación-de-funciones.html"><i class="fa fa-check"></i><b>6</b> Documentación de funciones</a>
<ul>
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

0 comments on commit 4b309bd

Please sign in to comment.