R中的aes和aes_string(ggplot2)有什么区别

What is the difference between aes and aes_string (ggplot2) in R

由于缺乏信息学背景,我很难理解 ggplot2 中 aesaes_string 之间的区别及其对日常使用的影响。

从描述 (?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 evaluationHadley 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 而不是在使用 ggplot2 时总是选择 aes_string...从这个意义上说它会有所帮助我找到了对这些概念的一些澄清和日常使用的实用提示。

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