В чем разница между 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