В чем разница между aes и aes_string (ggplot2) в R

С отсутствием фона в информатике мне трудно понять различия между aes и aes_string в ggplot2 и его последствиями для ежедневного использования.

Из описания (?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 описывается Хэдли Уикхем в своей книге Advanced R как метод, позволяющий не только вызывать значения аргумента функций, но и код, который их создал.

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

На веб-сайте внутри-R упоминается, что 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... В этом смысле это поможет мне найти некоторые разъяснения по этим концепциям и практический совет для ежедневного использования.

Ответ 1

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