我理解如何使用 aes,但我不理解程序化范例.
当我使用ggplot时,假设我有一个名为"animal"和"weight"的data.frame,我可以执行以下操作.
ggplot(df, aes(x=weight)) + facet_grid(~animal) + geom_histogram()
Run Code Online (Sandbox Code Playgroud)
我不明白的是,重量和动物不应该是字符串,它们只是按原样键入.我怎么能这样做?它应该是这样的:
ggplot(df, aes(x='weight')) + facet_grid('~animal') + geom_histogram()
Run Code Online (Sandbox Code Playgroud)
我不会在任何地方"宣称"体重或动物作为载体吗?这似乎......非常不寻常?这是一个宏还是某些东西让它变得"整体",它会查看df的列名,然后填补它在aes中看到这些变量名称的空白?
我想我想要的是在R中看到一些类似的函数,它可以获取未在作用域中声明的变量,以及该特性的名称,因此我可以进一步阅读并可能实现我自己的类似函数.
在R这称为非标准评估.高级R书中有一章关于R中的非标准评估,可在线免费获得.基本上R可以查看调用堆栈以查看传递给函数的符号,而不仅仅是符号指向的值.它在基础R中使用了很多.它在tidyverse中以稍微不同的方式使用,它有一个叫做quosure的正式类,使这个东西更容易使用.
这些方法非常适合交互式编程.它们可以保存击键和杂乱,但是如果你创建的函数过于依赖于该函数,则它们很难编写脚本或包含在其他函数中.
公式语法(带有的~)可能是使用符号的最安全和更程序化的方法.它捕获的符号可以在data.frame的上下文中使用以下函数进行评估model.frame().并且有一些内置函数可以帮助操作像update()和的公式reformulate.
既然你对这个aes()调用有明确的兴趣,你可以通过输入没有引号的名字来获取R中任何函数的源代码.使用ggplot2_2.2.1,功能看起来像这样
aes
# function (x, y, ...)
# {
# aes <- structure(as.list(match.call()[-1]), class = "uneval")
# rename_aes(aes)
# }
# <environment: namespace:ggplot2>
Run Code Online (Sandbox Code Playgroud)
最新版本的ggplot使用不同的rlang方法与其他tidyverse库更加一致,因此它看起来有点不同.
| 归档时间: |
|
| 查看次数: |
204 次 |
| 最近记录: |