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

时间:2015-03-06 11:11:30

标签: r ggplot2 aesthetics

由于缺少信息学背景,我很难理解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
Hadley Wickham in his book Advanced R

Non-standard evaluation描述为一种方法,不仅可以调用函数参数的值,还可以调用生成它们的代码。

我认为反对的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 ...在这个意义上它会帮助我找到一些关于这些概念的说明以及日常使用的实用提示。

1 个答案:

答案 0 :(得分:13)

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