2015-03-06 17 views
10

Z brakującym tłem w informatyce, mam trudności w zrozumieniu różnic między aes i aes_string w ggplot2 i jego konsekwencjach dla codziennego użytkowania.Jaka jest różnica między aes i aes_string (ggplot2) w R

Z opisu (?aes_string) udało mi się zrozumieć, że zarówno describe how variables in the data are mapped to visual properties (aesthetics) of geom.

Ponadto mówi się, że aes uses non-standard evaluation to capture the variable names. natomiast aes_string używa regular evaluation.

z przykładu kodu jest oczywiste, że zarówno w produkcji tego samego wyjścia (a list of unevaluated expressions):

> aes_string(x = "mpg", y = "wt") 
List of 2 
$ x: symbol mpg 
$ y: symbol wt 
> aes(x = mpg, y = wt) 
List of 2 
$ x: symbol mpg 
$ y: symbol wt 

Non-standard evaluation opisaną przez Hadley Wickham in his book Advanced R jako sposób, nie można ograniczyć do wartości w funkcji argumentu ale również kod, który wyprodukował je.

Zakładam, że regular evaluation w opozycji wywołuje tylko wartości z funkcji, ale nie znalazłem źródła, aby potwierdzić to założenie. Ponadto nie jest dla mnie jasne, w jaki sposób te dwa elementy się różnią i dlaczego ma to znaczenie dla mnie, gdy korzystam z pakietu.

Na inside-R website wspomniano, że aes_string is particularly useful when writing functions that create plots because you can use strings to define the aesthetic mappings, rather than having to mess around with expressions.

Ale w tym sensie jest dla mnie jasne, dlaczego należy zawsze używać aes i nie zdecydować się na zawsze, gdy używając ggplot2aes_string ... W tym sensie, że to mi pomoże znaleźć wyjaśnienia dotyczące tych koncepcji i praktyczne wskazówki dotyczące codziennego użytkowania.

Odpowiedz

12

aes oszczędza ci trochę pisania, ponieważ nie potrzebujesz cytatów. To wszystko. Oczywiście możesz zawsze używać aes_string. Powinieneś użyć aes_string, jeśli chcesz programowo przekazać nazwy zmiennych.

Wewnętrznie aes używa match.call do niestandardowej oceny. Jest prosty przykład dla ilustracji:

fun <- function(x, y) as.list(match.call()) 
str(fun(a, b)) 
#List of 3 
# $ : symbol fun 
# $ x: symbol a 
# $ y: symbol b 

Dla porównania

library(ggplot2) 
str(aes(x = a, y = b)) 
#List of 2 
# $ x: symbol a 
# $ y: symbol b 

Symbole są oceniane w późniejszym etapie.

aes_string wykorzystuje parse do osiągnięcia tego samego:

str(aes_string(x = "a", y = "b")) 
#List of 2 
# $ x: symbol a 
# $ y: symbol b