Skip to content

R Notebook

Un compendio de recursos y ejemplos sobre cómo usar R para diferentes cosas.

Aportes, correcciones y comentarios bienvenides!

Cheatsheets

Notas de desarrollo de paquetes en R

Algunas experiencias de armar paquetes; algunos con apps de shiny o que compilan funciones de C.

Link al sitio.

IDEs para R

RStudio

Ver el sito dedicado.

Excelente IDE para trabajar en R, con soporte para reticulate/Python, y bocha de funcionalidad para desarrollo de paquetes.

Atajos en R-studio.

VSCode

Instalacion en Arch:

  sudo pacman -S code

En R, correr:

  install.packages(“languageserver”)

Instalar complementos para R:

  • Un tutorial (se puede saltear la parte de instalar "R LSP Client", creo que esta incluida ahora).
  • Otro tutorial.
  • Instalar radian parece piola.

Settings:

++++Mostrar JSON conf file|json conf

{
    "window.zoomLevel": 2,
    "terminal.integrated.shell.linux": "/bin/zsh",
    "r.bracketedPaste": true,
    "r.alwaysUseActiveTerminal": true,
    "r.rterm.linux": "/home/TU_USUARIO/.local/bin/radian",
    "r.rpath.linux": "/usr/bin/R",
    "workbench.statusBar.visible": false
}

++++

Keybindings en ~/.config/Code\ -\ OSS/User/keybindings.json

++++Mostrar JSON keybindings|json keybs

// Place your key bindings in this file to override the defaultsauto[]
[
    {
        "key": "ctrl+t",
        "command": "r.createRTerm",
        "when": "editorTextFocus"
    },
    {
        "key": "alt+-",
        "command": "editor.action.insertSnippet",
        "when": "editorTextFocus",
        "args": {
            "snippet": " <- "
            }
    },
        {
        "key": "ctrl+shift+m",
        "command": "editor.action.insertSnippet",
        "when": "editorTextFocus",
        "args": {
            "snippet": " %>% "
            }
    },
        {
        "key": "ctrl+alt+i",
        "command": "editor.action.insertSnippet",
        "when": "editorTextFocus",
        "args": {
            "snippet": "```{r}\n```"
            }
    },
    {
        "key": "ctrl+shift+c",
        "command": "editor.action.commentLine",
        "when": "editorTextFocus && !editorReadonly"
    }
]

++++

Lenguaje

Ayuda

  • Leer la documentacion: ver viñetas, usar ?.
  • Pedir ayuda :P
  • Googlear errores!

Base

> ?Syntax

Asignaciones: <- = -> <<-

Los pipes: |> %>% %$%

Paréntesis y llaves: () {}

Dos puntos: :

Acceder a datos: [] $ @

Operaciones básicas: + - * ** ^ / %% %/%

Operadores para filtrar 12: & | ! && || > < == %in%

Verdadero, Falso y missing value: TRUE, FALSE, T, F, NA, NULL

Funciones anónimas: function(x) \(x)

Cosas raras:

El infierno de R.

Avanzado

Objetos: funciones, datos, S4, …

Buenas prácticas: codear con estilo, r-coding-style-guide

Environments y scopes:

Evaluación: I(), deparse(substitute(object)), eval, non-standard evaluation y tidy evaluation.

Expresiones regulares: regex

 * [[https://www.r-bloggers.com/demystifying-regular-expressions-in-r/|desmitificaciones]]
* [[https://regex101.com/|https://regex101.com/]] para armar y debuggear tus regex.
* regex [[https://dev.to/emmawedekind/regex-cheat-sheet-2j2a|cheatsheet]]
* armar regex [[https://www.r-bloggers.com/programmatically-generate-regex-patterns-in-r-without-knowing-regex/|sin regex]]
* algo que las arme [[https://www.r-bloggers.com/regex-problem-heres-an-r-package-that-will-write-regex-for-you/|por mi]].

Funciones:

  • `>`() es la función que dice si algo es mayor a otra cosa, fijate: `>`
  • Uno puede pasar funciones a los argumentos de una función… funception (?)
  • se llama elipsis y es tu amigue.

Debuguear:

Programación orientada a objetos en R:

  • S3
  • También están los objetos "S4"

Paralelización y HPC

Ver página dedicada: proyectos/atr/temas-sugeridos/parallel

  • Dos paquetes amigables: foreach y doParallel
  • Clusters: PSOCK, FORK, y otros.
  • Chunking.
  • Una guía con plyr: https://jstaf.github.io/hpc-r/
  • El tidyverse tambien tiene sus implementaciones, pero no las exploré.
  • En R base, se usa parallel y funciones como parLapply

Cursed R

Listas de la nada:

> x = NULL
> x[["asd"]][["sdf"]] = 3
> x
$asd
$asd$sdf
[1] 3

Datos: Tipos y Estructuras

Como tener y usar "tidy data".

Cargar y guardar datos 1: read_files

Cargar y guardar datos 2: save, saveRDS, fread y fwrite, y feather para R y Python.

Estructuras: array, c(), data.frame, data.table, matrix, RLE, list, objetos, ...

Tipos de datos: numeric, character, logical, factor, typeof()

Strings: strings en R base, quasi-quotation

Cómo usar glue (en vez de paste).

A veces conviene trabajar con una base de datos real (tipo SQL, por ejemplo). En ese caso hay diferentes maneras de interactuar con ellos. Una es usar DBI.

Ayuda con fechas y el tiempo: https://www.r-bloggers.com/lubridate-ggplot-date-helpers/

Manipulación de tablas y datos

Manipulación en Base R:

  • Seleccionar elementos con [] y [[ ]] (por índice o por nombre)
  • subset() y select()
  • Operador %in%
  • Ojo al usar datos[x, ] cuando x es un factor; puede no tener el efecto que esperás.
  • order(), split(), match()
  • apply() y lapply
  • matrices y arrays

Data wrangling:

Misc:

Multiple column melt / pivot_longer

Por estas cosas es que odio el tidyverse... fucking pretensiosos de la elegancia. Me dan ganas de editar R en vi.

Con melt: https://stackoverflow.com/a/28786520

Con pivot_longer: https://community.rstudio.com/t/pivot-longer-on-multiple-column-sets-pairs/43958/12

En melt de data.table, el uso de los argumentos es un poco más transparente. La desventaja es que no deja lindos los nombrecitos directamnte: https://stackoverflow.com/q/57435780

La ventaja es que entendes lo que hace.

```{r}
anscombe %>% data.table::setDT() %>% 
  data.table::melt(measure.vars = patterns("x", "y"),
                   variable.name = "id",
                   value.name = c("x", "y"))

anscombe %>% data.table::setDT() %>% 
  data.table::melt(measure.vars = list(1:4, 5:8),
                   variable.name = "id",
                   value.name = c("x", "y"))
```

```{r}
anscombe %>%
 pivot_longer(everything(),
   names_to = c(".value", "set"),
   names_pattern = "(.)(.)"
 )
```

Funciones, loops y scripting

Funciones, parámetros, return y scopes.

Pipes %>%

Loops: apply, for y foreach

“Loops in R Are Slow”: depende, pero no lo son si se usan bien.

Más control: if, while, repeat, beak, next, ifelse, switch, stop, try

Paralelizar loops: apply y %dopar%

Scripts, source y environments.

Operadores binarios

Son funciones con una sintaxis especial. Toman dos argumentos: uno se pone a la derecha y otro a la izqueirda del operador.

El ejemplo más básico es la suma con el +.

El + es un operador binario, porque toma dos argumentos, al igual que otros operadores matemáticos: la resta -, la multiplicación *, etc.

%in%

Por ejemplo, el operador %in% se puede usar así:

c(1,2,3,4) %in% c(1,3,5,7)

1:4 %in% c(1,3,5,7)

Noten que no hace falta usar paréntesis para pasar argumentos al operador, simplemente se escribe el primero a la izquierda (el LHS o "left hand side) y el segundo a la derecha (el RHS o "right hand side").

%>%

El "pipe" de magrittr, usado ampliamente en el tidyverse.

Usarlo agrega un poco de "overhead" (tiempo de ejecución).

Si estás haciendo muchas cuentas cortitas en un loop (y/o paralelizando) es mejor no usarlo. Realmente puede hacer que una tarea de esas características tarde muchísimo más, solo por incluir pipes.

R tiene su propio pipe |>: https://www.r-bloggers.com/2021/05/the-new-r-pipe/

Crear nuevos

Para trasladar los operadores de Python 3.9 para diccionarios | y |= a R, podemos usar listas y operadores binarios.

Ver:

Y el código queda así:

`%|%` <- function(l1, l2){
  l1[names(l2)] <- l2
  return(l1)
}

`%|=%` <- function(l1, l2){
  common.names <- names(l2)[names(l2) %in% names(l1)]
  l1[common.names] <- l2[common.names]
  return(l1)
}

lista1 <- list(hola = "HOLA", chau = "BYE", hmm = "HMM")

lista2 <- list(hola = "HOLA", chau = "CHAUCHAS", quetal = "COMO VA")

lista1
lista2
lista1 %|% lista2

lista1 %|=% lista2

Nota: esto no asigna el resultado a lista1. Se puede hacer, pero este tipo de "efectos secundarios" (los side effects) no son recomendados como práctica de programación funcional en R:

Trabajo prolijo

Proyectos (o cómo trabajar prolijo):

Presentando datos a tu boss:

Para generar informes podemos usar:

Rmarkdown

Ver página dedicada: proyectos/atr/notebook/rmarkdown

"Rmarkdown is probably the gratest document file format *ever*".

Generalidades: https://www.youtube.com/watch?v=uccEhThn0ls&list=PL5fd4SsfvECyYYiSW3ZreC5GqIq8FBocx&index=4

Usar Rmarkdown: proyectos/atr/temas-sugeridos/rmarkdown

Paquetes

Herramientas:

Una increible lista de paquetes utiles:

Un libro: R Packages

Estadística y Regresión

Básica

model formulas

Ver: https://www.datacamp.com/community/tutorials/r-formula-tutorial

General

Herramientas basicas

Bayes

Redes

Errores

Una CRAN task view que me interesa es la de "metrología": https://github.com/cran-task-views/ChemPhys/blob/main/ChemPhys.md#metrology

Tiene un par de paquetes para agregar unidades y errores a los vectores, y para propagar automáticamente ambas cosas:

Parece haber al menos dos clases de propagacion para la suma: la que suma la magnitud errores, y el usual con las derivadas parciales. Creo que el criterio para la primer clase es la del "máximo error", y el otro enfoque vendría a ser el "estadístico".

Extra

Extra extra

p-olemica:

Selection bias:

Simulación de datos

Datos simulados con significado, especialmente para docencia

Optimización

Una nota de 2012.

Un review de CRAN.

Una comparación.

Optimizacion simbolica en R, con Jacobiano y Hessiano (aprox.):

Regresión no lineal y NLS

Ver:

Machine learning

Torch en R

https://blogs.rstudio.com/ai/posts/2020-10-19-torch-image-classification/

Matemática

Álgebra:

Cálculo:

Diferenciación:

Integración:

Hashing:

digest:digest
vdigest <- Vectorize(digest::digest)

Dinámica no lineal

Usé Rungge-Kutta (RK4) del paquete pracma. Tiene una función para una ecuación y otra para sistemas de ecuaciones.

Series temporales y Forecasts

Intro:

Time series parece ser un mundo aparte.

Stock market:

Varios de R-bloggers:

Visualización

Libro: Fundamentos de dataviz.

Lo básico

  • plot()
  • ggplot() y qplot() en ggplot2

Extra

  • + list() y %+% para modificar ggplots
  • ggpairs() y otros en ggally
  • plotly
  • gghighlight
  • grid.arrange() en gridExtra.
  • patchwork

Tablas lindas

Paletas de colores

Graficos circulares

Referencia: https://jokergoo.github.io/circlize_book/book/

Exportar figuras

Para generar figuras que querramos usar en Inkscape (para unposter xej), hay que exportarlas en PDF.

Eso es porque Inkscape no puede acceder al width/height en los SVG que genera R, y al importarlos se deforman.

Avanzado

Graficos prediseñados:

  • The ggpubr R package facilitates the creation of beautiful ggplot2-based graphs for researcher with non-advanced programming backgrounds.

Interactivos: plotly y chartbookr

Interactivos mas avanzados: shiny y R2D3

Discusión: tipos de gráficos para tipos de datos (ver: heatmaps, trees, facets, multiplot, ...)

Redes y grafos:

Más tipos de gráficos:

Hacks:

  • Para ordenar las variables en un boxplot de ggplot, antes de graficar hay que convertir la variable de interés en factor y ordenar sus niveles a mano: datos$columna <- factor(datos$columna, levels = c("B", "C1", "D","A2","X"))

Hay decenas de sitios con listas de ejemplos:

ggplot2 notes

Zoom: http://rstudio-pubs-static.s3.amazonaws.com/209392_437ec4da7fa2432d831320f3591e7491.html

Imágenes

Magia con magick.

Reconocimiento de texto con Tesseract, videos con av: https://www.r-bloggers.com/updates-to-the-ropensci-image-suite-magick-tesseract-and-av/

Clasificacion supervisada de imagenes: https://www.r-bloggers.com/supervised-image-classification-with-imagej-and-r-in-bio7/

R remoto

Formas de correr R en otra compu, y ver los gráficos en la tuya:

R y Python

¿Qué elegir y cuándo?

Integraciones:

R y Biología

¿Esta sería la parte específica?

Dash BIO

https://moderndata.plot.ly/introducing-dash-bio-for-r/

Enseñar R

Aplicaciones de R en Biología

qPCR: qpcR EasyqpcR

Microscopía: colocalización, rOpenSci, ImageJ TIFF, z-magick, rOpenSci munster

Bioinfo Strings Bio.strings GRanges ..?

Alinear: rBLAST Subread Bowtie Clustal ..?

Anotar: bioMart AnnotationDBI ..?

Bases de datos: MotifDB org.Hs.eg.db

Otros: ChIP-Seq Single-cell seq 3 Networks ..?

Citometría: flowCore openCyto

Machine Learning: Genetic Algorithms Algo simple Otro with Keras, hands-on workshop

Modelado: sysBio, smfsb

Misc cosas copadas

ESTADÍSTICA

The 40 data core science techniques:

  • Linear Regression
  • Logistic Regression
  • Jackknife Regression
  • Density Estimation
  • Confidence Interval
  • Test of Hypotheses
  • Pattern Recognition
  • Clustering - (aka Unsupervised Learning)
  • Supervised Learning
  • Time Series
  • Decision Trees
  • Random Numbers
  • Monte-Carlo Simulation
  • Bayesian Statistics
  • Naive Bayes
  • Principal Component Analysis - (PCA)
  • Ensembles Neural Networks
  • Support Vector Machine - (SVM)
  • Nearest Neighbors - (k-NN)
  • Feature Selection - (aka Variable Reduction)
  • Indexation / Cataloguing
  • (Geo-) Spatial Modeling
  • Recommendation Engine
  • Search Engine

R Shiny Apps

Shiny VS Excel

https://www.r-bloggers.com/forget-about-excel-use-these-r-shiny-packages-instead/

Extra Shiny

https://www.r-bloggers.com/shiny-apps-need-more-info-our-new-shiny-info-package/

https://adisarid.github.io/post/2019-07-03-shiny_app_lessons/

https://www.r-bloggers.com/dynamic-ui-elements-in-shiny/

Cosas para leer

Links para ordenar:

Boludeces & Misc:

  Dark IDE Theme
  https://www.r-bloggers.com/super-dark-ide-theme-r-studio-inverted-color/
  https://www.r-bloggers.com/cross-platform-super-dark-ide-theme-r-studio-server/

  Using RStudio and LaTeX
  https://www.r-bloggers.com/using-rstudio-and-latex/

  Drrrawing with purrr
  https://www.r-bloggers.com/drrrawing-with-purrr/

  What it the interpretation of the diagonal for a ROC curve
  https://www.r-bloggers.com/what-it-the-interpretation-of-the-diagonal-for-a-roc-curve/

  R and labelled data: Using quasiquotation to add variable and value labels #rstats
  https://www.r-bloggers.com/r-and-labelled-data-using-quasiquotation-to-add-variable-and-value-labels-rstats/

El Infierno de R

Errores

Instalar un paquete: "Warning in file.append"

E> Warning in file.append(to[okay], from[okay]) :
E>   write error during file append

Posiblemente no haya espacio en el disco: https://github.com/rstudio/packrat/issues/410

Casos de ejemplo

Algunos ejemplos de análisis hechos en R.

Debates democráticos y Bigram

https://www.r-bloggers.com/bigram-analysis-of-democratic-debates/

Twitter

https://www.r-bloggers.com/twitter-account-analysis-in-r/

Política en Wikipedia

https://www.r-bloggers.com/studying-politics-on-and-with-wikipedia/