概述
代码整洁之道 书中的例子
R中的整洁评估或简称整洁的评估是一个非常复杂的话题。 但是对于某些特定用途,它并不那么复杂。 整洁的eval帮助完成的一项重要任务既有用又简单:将dplyr和ggplot2之类的程序包中的函数合并到您自己的自定义函数中。
编者注:由于rlang程序包的{{}}整洁的求值运算符,有了一种新的甚至更容易的方法来执行此操作。 在如何在R中编写自己的ggplot2函数中了解其工作原理。
让我来看一个例子。 使用无处不在的mtcars样本数据集,这就是我可能如何按重量对每加仑的英里进行散点图绘制,使用dplyr过滤仅适用于更高MPG的汽车(我还添加了一些样式调整):
library(ggplot2)
library(ggthemes)
library(dplyr)
library(rlang)
graph_title <- "MPG by Weight (thousands lbs) for higher MPG cars"
filter(mtcars, mpg >= 20) %>%
ggplot(aes(x=wt, y=mpg)) +
geom_point(color = "darkblue") +
theme_hc() + xlab("") + ylab("") +
ggtitle(graph_title) +
theme(plot.title = element_text(size = 14, hjust = 0.5)) +
geom_smooth(method = 'lm', formula = y~x, se = FALSE, linetype = "dotted", color = "darkgrey")
接下来,我想用此代码创建一个函数 ,以便我可以轻松地重用这些自定义项来绘制其他数据,而不仅仅是mtcars。 在那里,整洁的评估可以解决问题。
这是创建该功能的首次尝试。 它只是将我的图形代码包装在一个新函数中:
fun1 <- function(mydf, mytitle, myxcol, myycol, minyval = 20){
dplyr::filter(mydf, myycol >= minyval) %>%
ggplot(aes(x=myxcol, y=myycol)) +
geom_point(color = "darkblue") +
theme_hc() + xlab("") + ylab("") +
ggtitle(mytitle) +
theme(plot.title = element_text(size = 14, hjust = 0.5)) +
geom_smooth(method = 'lm', formula = y~x, se = FALSE, linetype = "dotted", color = "darkgrey")
}
要使用此功能,添加图形标题,数据框和默认最小值作为参数非常简单。 但是您会遇到数据框列名称的问题。
如果我在函数中使用未引用引号的 wt
和mpg
,例如ggplot,则会出现错误。 如果您运行fun1(mydf = mtcars, mytitle =" MPG by Weight (thousands of pounds", wt, mpg)
就会看到此信息
那是因为我的函数正在查找名为wt
和mpg
对象 ,并且不存在这样的独立对象。 ggplot和dplyr理解未加引号的参数不是独立的对象,但“常规” R则不是。
如果我尝试将wt
和mpg
用作引号 ,您也可以使用
fun1(mydf = mtcars, mytitle =" MPG by Weight (thousands of pounds", "wt", "mpg")
我得到一个图,但没有我想要的图。
那是因为我的函数现在认为这些参数是字符串,而不是mtcars数据列的表示。
如果我尝试将mtcars$wt
和mtcars$mpg
的完整列用作参数,例如下面的代码, mtcars$mpg
出现另一个错误。
fun1(mydf = mtcars, mytitle =" MPG by Weight (thousands of pounds", mtcars$wt, mtcars$mpg)
这里的问题是tidyverse函数使用整齐的评估。 他们不会立即评估变量的值。 但是我的常规R函数确实会立即评估参数的值,因为它使用变量的标准评估。
我以某种方式需要我的函数执行与tidyverse函数相同的操作,并使用整洁的评估。
那我该怎么做呢?
我需要有时被认为是一个元变量的一种特殊的变量,它引用另一个变量而不是包含一个或多个值 。
这就是rlang程序包所说的“ quosure”。 Hadley Wickham更准确地描述了一种既捕获R 表达式又表示该表达式的环境的环境 。 与常规变量相比,与常规变量相比,特殊之处在于,如果您在代码中使用了定量,R不会尝试获取其中的值, 直到您告诉它为止 。
在常规R编程(以及大多数编程)中,我可以使用简单的代码(例如x <- 3
创建引用3的变量x。 每当我想在代码中使用值 3时,都可以使用实际值 3,或者,如果将3分配给变量x
,则可以使用x
表示该值。 R将立即评估x
的值。 如果在控制台中输入x ^ 2
(将3赋给变量x
),则得到3平方的值。 通常使用变量会使代码更可重用。
行为不同。 您可以使用rlang包的enquo()
函数来创建quosure。 要创建一个名为quosure x2
是指我的“正规”的变量x
,我可以使用代码
x2 <- enquo(x)
如果在R控制台中键入x2
,则您再也看不到内部的简单值,即它在键入x
时的工作方式。 相反,它显示了一个更复杂的结构:
<quosure>
expr: ^3
env: empty
要访问该Ququoise包含的值 ,您必须告诉R何时以及如何执行此操作。 我有时会想到具有时序元素的quasure,因此您的代码只有在您这样说之前,才尝试获取其中的内容。 在控制台中以交互方式,您可以使用quo_get_expr()
来查看单据的存储值,例如quo_get_expr(x2)
。
但是,你正在编写一个函数里,你想要的quosure的价值和它的环境。 您可以使用“ bang bang”运算符来访问这两者:2个感叹号。 每当您需要存储在quosure中的完整表达式时,只需用!!
引用quosure对象即可!!
在前。
最后一个提示:当编写需要定量的R函数时,请确保在代码中需要这些变量之前先创建这些定量。
这是一个经过修改的函数,用于生成我的图形,并带有斜体更改:
fun2 <- function(mydf, mytitle, myxcol, myycol, minyval = 20){
myxcol_quosure <- rlang::enquo(myxcol)
myycol_quosure <- rlang::enquo(myycol)
dplyr::filter(mydf, !!myycol_quosure >= minyval) %>%
ggplot(aes(x= !!myxcol_quosure , y= !!myycol_quosure ) ) +
geom_point(color = "darkblue") +
theme_hc() + xlab("") + ylab("") +
ggtitle(mytitle) +
theme(plot.title = element_text(size = 14, hjust = 0.5)) +
geom_smooth(method = 'lm', formula = y~x, se = FALSE,
linetype = "dotted", color = "darkgrey")
}
该函数的前两行创建目标。 接下来的两行使用bang bang来使用quosures。
现在,如果运行以下命令,此函数可用于未加引号的变量:
fun2(mydf = mtcars, mytitle ="MPG by Weight (thousands of pounds)", myxcol = wt, myycol = mpg)
您应该看到如下图:
这是一个非常简单的情况。 我希望rlang软件包的作者Lionel Henry和Hadley Wickham在阅读时不要对这种解释感到恐惧。 但是对于这个基本用例,它对我有用。 我希望它也对您有用。
关于整洁的eval还有更多的知识,并且在rlang软件包中还有更多的运算符。 您可以从RStudio的tidyeval.tidyverse.org中了解更多信息 。
翻译自: https://www.infoworld.com/article/3367744/tidy-eval-in-r-a-simple-example.html
代码整洁之道 书中的例子
最后
以上就是迷你香菇为你收集整理的代码整洁之道 书中的例子_R中的整洁评估:一个简单的例子的全部内容,希望文章能够帮你解决代码整洁之道 书中的例子_R中的整洁评估:一个简单的例子所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复