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

26

由于我的信息学背景欠缺,我很难理解ggplot2中和之间的差异及其对日常使用的影响。

从描述(?aes_string)中,我理解了两者都描述了数据中的变量如何映射到几何图形的美学特性。

此外,它还指出使用正则表达式评估。

从示例代码可以清楚地看出,两者都会产生相同的输出(一组未评估的表达式列表)。

> 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在他的书Advanced R描述为一种方法,不仅调用函数参数的值,而且还调用生成这些值的代码。

我认为,相反地,常规评估仅调用函数中的值,但我没有找到可以确认这个假设的来源。此外,我不清楚这两者之间的区别以及当我使用该软件包时,这为什么对我很重要。

inside-R网站上提到,aes_string在编写创建图形的函数时特别有用,因为您可以使用字符串来定义美学映射,而不必使用表达式。

但是从这个意义上说,我不清楚为什么我应该使用aes而不是始终选择aes_string每次使用ggplot2...在这方面,希望能够对这些概念进行一些澄清,并提供日常使用的实用提示。

1个回答

25

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

3
不幸的是,这并不简单:ggplot在使用aesaes_string时绘图行为不同。它以不同的方式搞乱了内存并绘制出不同的图形... 例如,请参见https://dev59.com/zX_aa4cB1Zd3GeqP1lKn。ggplot本身就是一个巨大的问题。 - Stéphane
4
自ggplot 3.0.0及其支持的!!之后,如果您想通过编程方式传递变量名,则应使用aes_string已不再正确。请参见https://dev59.com/mWEh5IYBdhLWcg3whT3T#53168593。 - moodymudskipper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接