2015-03-06 2 views
10

С отсутствующим фоном в информатике мне трудно понять различия между aes и aes_string в ggplot2 и его последствиями для ежедневного использования.В чем разница между aes и aes_string (ggplot2) в R

Из описания (?aes_string) Я был в состоянии понять, что и describe how variables in the data are mapped to visual properties (aesthetics) of geom.

Кроме того, сказано, что aes uses non-standard evaluation to capture the variable names., тогда как aes_string использует regular evaluation.

Из примера кода видно, что оба дают одинаковый выход (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 описывается Hadley Wickham in his book Advanced R как метод, чтобы не вызывать только значения в функции аргумента, но и код, который произвели их.

Я бы предположил, что regular evaluation в оппозиции вызывает только значения из функции, но я не нашел источник для подтверждения этого предположения. Кроме того, мне непонятно, как эти два отличаются друг от друга и почему это должно иметь отношение ко мне, когда я использую пакет.

На inside-R website упоминается, что 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.

Но в этом смысле не ясно мне, почему я должен когда-либо использовать aes и не всегда выбирают для aes_string всякий раз, когда с помощью ggplot2 ... В этом смысле это помогло бы мне найти некоторые разъяснения по этим концепциям и практический совет для ежедневного использования.

ответ

12

aes экономит на некоторых печатных машинах, поскольку вам не нужны кавычки. Вот и все. Вы, конечно, можете свободно использовать aes_string. Вы должны использовать aes_string, если вы хотите программно пропустить имена переменных.

Внутренний номер aes использует match.call для нестандартной оценки. Вот простой пример для иллюстрации:

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

Для сравнения:

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

Символы оцениваются на более позднем этапе.

aes_string использует parse для достижения той же:

str(aes_string(x = "a", y = "b")) 
#List of 2 
# $ x: symbol a 
# $ y: symbol b 
Смежные вопросы