由于缺少信息学背景,我很难理解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.
而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
...在这个意义上它会帮助我找到一些关于这些概念的说明以及日常使用的实用提示。
答案 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