ITPub博客

首页 > > > R语言进阶 | 非标准计算base

R语言进阶 | 非标准计算base

作者:浪花小雨滴 时间:2020-06-16 15:27:31 0 删除 编辑

R语言的非标准计算在做初步数据分析应用的不多,但是会给分析工作带来便捷。

这个系列是主要是阅读和学习R官方的R Language Definition,还有Hadley Wickham写的Advanced R,还有tidyverse官方的资料的笔记。

Hadley Wickham说非标准计算的最终目的是进行元编程。我理解的元编程就是操作代码的技术,编写像字符串文本一样操作目标代码的代码。

学习这个的主要目的是写一些比较便捷的代码,实现常规方法不好实现的需求。

本系列计划:

  • 原生的非标准计算,主要是base包的函数
  • tidyeval,rlang包提供的非标准计算
  • 一些简单的实际应用

这一部分主要讲在R base包中的一些函数,这些函数实现了R语言的非标准计算。

- 语法解析:substitute(), parse(), deparse()  
- 表达式构造:quote()
- 表达式求值:eval(), source()
- 表达式:expression()

parse

parse主要负责把字符解析为R语言表达式。表达式是可以被求值的代码。


可以看出来是一个表达式expression。

在R中解析有三种不同的变种:

  • The read-eval-print loop
  • Parsing of text files
  • Parsing of character strings

read-eval-print 是读入文本,然后进行解析,然后求值,最后打印,这个就是我们日常看到的命令行操作。

解析文件是parse函数来完成。

解析字符串就是parse中用text参数来表示。

deparse

deparse是相反的,是把R表达式逆解析为字符。

quote

quote则是捕捉未计算的表达式。

eval

quote是捕捉表达式,不进行计算(求值),将由eval来完成对表达式进行计算(求值)。

一般是用parse从字符串(或者是硬盘上的文件)解析成一个expression对象,是表达式列表,不是一个表达式。expression也可以手动构建表达式,但是Hadley Wickham不赞成这么写。

首先使用parse()函数将字符串转化为表达式(expression),而后使用eval()函数对表达式求解。

?eval
# Evaluate an R expression in a specified environment.
# Usage
# eval(expr, envir = parent.frame(),
#      enclos = if(is.list(envir) || is.pairlist(envir))
#          parent.frame() else baseenv())
# evalq(expr, envir, enclos)
# eval.parent(expr, n = 1)
# local(expr, envir = new.env())

表达式的操作和计算

下面这个就实现了表达式的操作和计算。

本来是1+2的表达式。表达式可以像list一样来操作。

下面可以操作这个表达式,变成1-2。

下面这个可以再次变成1*2。

但是如果被计算的对象没有找到,那么会出错。

这个给a赋值,后就可以顺利计算。

即使变量是存在的,但是如果变量换了一个新环境,直接计算是错误的。

必须指明环境才可以。

父环境与子环境。

这个说明,在eval时遇到未定义的变量时首先是全局环境,如果有指定环境,则进入指定环境找,还会跟根据需要找到子环境的父环境中去。

综合性例子

quote是捕捉未计算的表达式,expression是表达式。

这里发现,各个函数生成的对象不完全相同。如果需要深入理解差异性,需要仔细阅读R官方手册和源代码。

对表达式进行求值。

下一篇文章介绍Hadley Wickham等开发者倾力打造的tidyeval。rlang包实现这一功能,为tidyverse生态服务,所以又称tidyeval。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3156915/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2018-05-16

  • 博文量
    4259
  • 访问量
    40093