tres poligono pairs graficos grafico graficas grafica ejemplos cuadricula animados r ggplot2

poligono - ¿Son estas cadenas o variables?



poligono en r (4)

promesas

Cuando se pasa un argumento a una función, no se pasa como un valor sino que se pasa como una promesa que consiste en

  • la expresión o código que usa el que llama como argumento real
  • el entorno en el que se evaluará esa expresión, a saber. el ambiente de la persona que llama.
  • el valor que la expresión representa cuando la expresión se evalúa en el entorno de la promesa: este espacio no se completa hasta que la promesa se evalúa realmente. Nunca se completará si la función nunca accede a él.

El paquete pryr puede mostrar la información en una promesa:

library(pryr) g <- function(x) promise_info(x) g(ggplot2)

dando:

$code ggplot2 <-- the promise x represents the expression ggplot2 $env <environment: R_GlobalEnv> <-- if evaluated it will be done in this environment $evaled [1] FALSE <-- it has not been evaluated $value NULL <-- not filled in because promise has not been evaluated

La única de las ranuras anteriores en la salida pryr a la que se puede acceder en el nivel R sin escribir una función C para hacerlo (o utilizando un paquete como pryr que accede a dicho código C) es la ranura de código. Eso se puede hacer usando la función R substitute(x) (u otro medio). En términos de la salida de pryr, el substitute aplicado a una promesa devuelve el espacio del código sin evaluar la promesa. Es decir, el valor del espacio no se modifica. Si hubiésemos accedido a x de una manera ordinaria, es decir, no a través de un substitute , entonces el código se habría evaluado en el entorno de la promesa, se habría almacenado en el intervalo del valor y luego se habría pasado a la expresión en la función que accede a él.

Por lo tanto, cualquiera de los siguientes resultados en una cadena de caracteres que representa lo que se pasó como una expresión, es decir, la representación de caracteres de la ranura de código, a diferencia de su valor.

f <- function(x) as.character(substitute(x)) f("ggplot2") ## [1] "ggplot2" f(ggplot2) ## [1] "ggplot2"

biblioteca

De hecho, la library usa este modismo, es decir, como as.character(substitute(x)) , para manejar su primer argumento.

aes

La función aes utiliza match.call para obtener toda la llamada como una expresión y, en cierto sentido, es una alternativa a substitute . Por ejemplo:

h <- function(x) match.call() h(pi + 3) ## h(x = pi + 3)

Nota

Uno no puede decir sin mirar la documentación o el código de una función cómo tratará sus argumentos.

Procedente de un fondo C / Python / Java, tengo problemas para entender alguna sintaxis R, donde los literales parecen variables, pero parecen comportarse como cadenas. Por ejemplo:

library(ggplot2) library("ggplot2")

Las dos líneas se comportan de manera equivalente. Sin embargo, esperaría que la primera línea significara "cargar la biblioteca cuyo nombre está almacenado en la variable ggplot2" y dar un error como el object ''ggplot2'' not found .

Hablando de ggplot2:

ggplot(data, aes(factor(arrivalRate), responseTime, fill=factor(mode))) + geom_violin(trim=FALSE, position=dodge)

Las variables arrivalRate , responseTime y mode no existen, pero de alguna manera R sabe buscarlas dentro del marco de datos. Supongo que aes realidad recibe cadenas, que luego se procesan usando algo como eval .

¿Cómo R analiza el código que termina interpretando algunos literales como cadenas?


El concepto se llama "evaluación no estándar", y hay muchas maneras diferentes en que se puede usar en diferentes funciones R. Vea este capítulo del libro para una introducción.

Esta función de lenguaje puede ser confusa y posiblemente innecesaria para la función de library() , pero permite un código increíblemente poderoso cuando necesita especificar cómputos en marcos de datos, como es el caso en ggplot2 o en dplyr, por ejemplo.


Las líneas

library(ggplot2) library("ggplot2")

no son equivalentes En la primera línea, ggplot2 es un símbolo, que puede estar o no vinculado a algún valor. En la segunda línea, "ggplot2" es un vector de caracteres de longitud uno.

Una función, sin embargo, puede manipular los argumentos que obtiene sin evaluarlos, y puede decidir tratar ambos casos de manera equivalente, que es lo que aparentemente hace la library .

Aquí hay un ejemplo de cómo manipular una expresión no evaluada:

> f <- function(x) match.call() # return unevaluated function call > x <- f(foo) > x f(x = foo) > mode(x) [1] "call" > x[[1]] f > x[[2]] foo > mode(x[[2]]) [1] "name" > as.character(x[[2]]) [1] "foo" > x <- f("foo") > mode(x[[2]]) [1] "character"


Una peculiaridad interesante del lenguaje R es la forma en que evalúa las expresiones. En la mayoría de los casos, R se comporta de la manera esperada. Las expresiones entre comillas se tratan como cadenas, cualquier otra cosa se trata como una variable, función u otro token. Pero algunas funciones permiten la "evaluación no estándar", en la que una expresión sin comillas se evalúa, más o menos, como si fuera una variable entre comillas. El ejemplo más común de esto es la forma en que R carga las bibliotecas (que permite los nombres de las bibliotecas entre comillas o no citadas) y su interfaz de fórmula sucinta. Otros paquetes pueden aprovechar NSE. Hadley Wickham hace un uso extenso de ella a través de sus extremadamente populares paquetes tidyverse . Además de guardar al usuario algunos caracteres de tipeo, NSE tiene varias propiedades útiles para la programación dinámica.

Como se señaló en la otra respuesta, Wickham tiene un excelente tutorial sobre cómo funciona todo . El usuario de RPubs Lionel también tiene un excelente documento de trabajo sobre el tema .