-
Notifications
You must be signed in to change notification settings - Fork 1
/
Meta.qmd
27 lines (15 loc) · 4.18 KB
/
Meta.qmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# Introducción {#metaprogramming .unnumbered}
```{r, include = FALSE}
source("common.R")
```
\index{metaprogramming} \index{non-standard evaluation}
Una de las cosas más intrigantes de R es su capacidad para realizar **metaprogramación**. Esta es la idea de que el código son datos que se pueden inspeccionar y modificar mediante programación. Esta es una idea poderosa; uno que influye profundamente en mucho código R. En el nivel más básico, le permite hacer cosas como escribir `library("purrr")` en lugar de `library("purrr")` y habilitar `plot(x, sin(x))` para etiquetar automáticamente los ejes con `x` y `sin(x)`. En un nivel más profundo, te permite hacer cosas como usar `y ~ x1 + x2` para representar un modelo que predice el valor de `y` a partir de `x1` y `x2`, para traducir `subset(df, x = = y)` en `df[df$x == df$y, , drop = FALSE]`, y usar `dplyr::filter(db, is.na(x))` para generar el SQL `WHERE x IS NULL` cuando `db` es una tabla de base de datos remota.
Estrechamente relacionado con la metaprogramación está la **evaluación no estándar**, NSE para abreviar. Este término, que se usa comúnmente para describir el comportamiento de las funciones R, es problemático de dos maneras. En primer lugar, NSE es en realidad una propiedad del argumento (o argumentos) de una función, por lo que hablar de funciones NSE es un poco descuidado. En segundo lugar, es confuso definir algo por lo que no es (estándar), por lo que en este libro presentaré un vocabulario más preciso.
Específicamente, este libro se enfoca en la evaluación ordenada (a veces llamada evaluación ordenada para abreviar). La evaluación ordenada se implementa en el paquete rlang [@rlang], y usaré rlang extensamente en estos capítulos. Esto le permitirá concentrarse en las grandes ideas, sin distraerse con las peculiaridades de la implementación que surgen de la historia de R. Después de presentar cada gran idea con rlang, regresaré para hablar sobre cómo se expresan esas ideas en la base R. Este enfoque puede parecer atrasado para algunos, pero es como aprender a conducir usando una transmisión automática en lugar de una palanca. cambio: le permite concentrarse en el panorama general antes de tener que aprender los detalles. Este libro se centra en el lado teórico de la evaluación ordenada, para que pueda comprender completamente cómo funciona desde cero. Si está buscando una introducción más práctica, le recomiendo el libro de evaluación ordenado en <https://tidyeval.tidyverse.org>[^meta-1].
[^meta-1]: Mientras escribo este capítulo, el ordenado libro de evaluación es todavía un trabajo en progreso, pero para cuando lo lea, espero que esté terminado.
Aprenderá sobre la metaprogramación y la evaluación ordenada en los siguientes cinco capítulos:
1. El @sec-meta-big-picture brinda una descripción de alto nivel de toda la historia de la metaprogramación, aprendiendo brevemente sobre todos los componentes principales y cómo encajan para formar un todo cohesivo.
2. El @sec-expressions muestra que todo el código R se puede describir como un árbol. Aprenderá cómo visualizar estos árboles, cómo las reglas de la gramática de R convierten secuencias lineales de caracteres en estos árboles y cómo usar funciones recursivas para trabajar con árboles de código.
3. El @sec-quasiquotation presenta herramientas de rlang que puede usar para capturar (citar) argumentos de función no evaluados. También aprenderá sobre la cuasicomilla, que proporciona un conjunto de técnicas para eliminar las comillas de entrada para que sea posible generar fácilmente nuevos árboles a partir de fragmentos de código.
4. El @sec-evaluation pasa a evaluar el código capturado. Aquí aprenderá sobre una estructura de datos importante, el **quosure**, que garantiza una evaluación correcta al capturar tanto el código para evaluar como el entorno en el que se evalúa. Este capítulo le mostrará cómo juntar todas las piezas para comprender cómo funciona NSE en base R y cómo escribir funciones que funcionen como `subset()`.
5. El @sec-translation termina combinando entornos de primera clase, alcance léxico y metaprogramación para traducir el código R a otros lenguajes, a saber, HTML y LaTeX.