我是靠谱客的博主 迷你香菇,最近开发中收集的这篇文章主要介绍代码整洁之道 书中的例子_R中的整洁评估:一个简单的例子,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

代码整洁之道 书中的例子

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。 在那里,整洁的评估可以解决问题。

[ 在我们的视频教程系列中获得Sharon Machlis的R技巧 。 | 阅读InfoWorld教程: 学习使用R处理大数据 。 • 如何重塑R中的数据 。 • 触手可及的R数据操作技巧 • R的 初学者指南 。 | 通过InfoWorld大数据报告新闻通讯了解最新的分析和大数据。 ]

这是创建该功能的首次尝试。 它只是将我的图形代码包装在一个新函数中:

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")
}

要使用此功能,添加图形标题,数据框和默认最小值作为参数非常简单。 但是您会遇到数据框列名称的问题。

如果我在函数中使用未引用引号的 wtmpg ,例如ggplot,则会出现错误。 如果您运行fun1(mydf = mtcars, mytitle =" MPG by Weight (thousands of pounds", wt, mpg)就会看到此信息

那是因为我的函数正在查找名为wtmpg 对象 ,并且不存在这样的独立对象。 ggplot和dplyr理解未加引号的参数不是独立的对象,但“常规” R则不是。

如果我尝试将wtmpg用作引号 ,您也可以使用

fun1(mydf = mtcars, mytitle =" MPG by Weight (thousands of pounds", "wt", "mpg")

我得到一个图,但没有我想要的图。

图形错误 Sharon Machlis / IDG

不是我希望看到的图

那是因为我的函数现在认为这些参数是字符串,而不是mtcars数据列的表示

如果我尝试将mtcars$wtmtcars$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)

您应该看到如下图:

mpg的ggplot2重量图 Sharon Machlis / IDG

带有quasures函数的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中的整洁评估:一个简单的例子所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部