22

由于缺少信息学背景,我很难理解 ggplot2 之间的差异aes及其aes_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.whileaes_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 在他的书Advanced R中将其描述为一种方法,不仅可以调用函数参数的值,还可以调用生成它们的代码。

我会假设regular evaluation相反只调用函数中的值,但我没有找到证实这一假设的来源。此外,我不清楚这两者有何不同,以及为什么在我使用该软件包时这与我有​​关。

inside-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......从这个意义上说,这将帮助我找到对这些概念的一些澄清和日常使用的实用提示。

4

1 回答 1

22

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
于 2015-03-06T11:28:02.483 回答