R语言 substitute

来自:
http://www.biosino.org/R/R-doc/R-lang/Substitutions.html#Substitutions

事实上,向上节内容中提到的一样,修改一个表达式内部结构是很少见的。 最常见的是,用户简单地想得到一个表达式以分析它并且用它 来作标记图形一类的事情。这样的一个例子可见于 plot.default 实现代码的起始部分:

     xlabel <- if (!missing(x))deparse(substitute(x))

这使得 plot的x参数变量或表达式随后可 用来标记x-轴。

实现这一要求的是函数 substitute。它获得表达式 x 并且替换通过形式参数 x 传递的表达式。 注意,为了保证这样运行, x 必须拥有产生它的值的表达式的 信息。这和 R 的悠闲求值架构有关(see Promise objects)。 一个形式参数事实上是一个允诺,该对象有三个槽变量, 一个用于定义它的表达式,一个用于表达式求值的环境, 还有一个用于表达式的求值结果。 substitute 识别允诺变量并且替换它的表达式槽变量的值。 如果 substitute 在一个函数内部被调用, 该函数的局部变量也受替换支配。

substitute 的参数没有必要是一个简单的标识符,它可以 是一个含有多个变量的表达式。此时,任何一个变量都会发生替换。 同样,substitute 有一个额外的参数,它是一个 变量可以搜索的环境或者列表。例如:

  substitute(a + b, list(a = 1, b = quote(x)))# 1 + x

注意,引用(quoting)是x替换所必需的。这种构造方便 在图中增加数学表达式,如下面的代码所示

      plot(0)for (i in 1:4)text(1, 0.2 * i,substitute(x[ix] == y, list(ix = i, y = pnorm(i))))

值得注意的是替换是纯词法上实现的; 如果它们被求值了,则不会对结果调用对象的意义进行检验。 substitute(x <- x + 1, list(x = 2)) 会恰当地返回 2 <- 2 + 1。但是, R的有些部分自己定义了什么是有意义 和什么无意义的规则,而且事实上就是采用了这些形式上有问题的表达式。 例如,使用“图中数学”的特性时常常会有语法上正确,但求值毫无意义的 构造,如 {}>=40*” years”。

替换不会对第一个参数求值。这导致如何替换包含在一个变量中的对象的 问题。 解决问题的方法是再用一次 substitute ,如下所示

     > expr <- quote(x + y)> substitute(substitute(e, list(x = 3)), list(e = expr))substitute(x + y, list(x = 3))> eval(substitute(substitute(e, list(x = 3)), list(e = expr)))3 + y

替换的精确规则如下: 第一个参数的解析树的每个符号 和第二个参数匹配,既可以是有标签的列表也可以是环境框架。如果它 是一个简单的局部对象,它的值将被插入, 除非它 匹配全局变量。如果它是一个允诺(常常是函数参数), 允诺表达式会被替换。如果符号没有被匹配,它不会有任何改变。 而在最高层次的替换很少有例外的。1 这是从 S 继承而来,原理基本上是变量可能在那个层次上绑定 使得替换最好和quote类似而且没有控制。2

如果局部变量在substitute使用前被替换,允诺替换的规则和 S相应的规则稍稍有点不同。 R 将使用变量的新值,而 S 将无条件地使用参数表达式 — 除非它是一个常量。这导致一个很古怪的结果,即在S里面 f((1)) 可能和 f(1) 差异很大。但 R 的规则相当地清晰,尽管 它也有一些比较奇怪的和悠闲求值相关结果。 参看下面的例子

 logplot <- function(y, ylab = deparse(substitute(y))) {y <- log(y)plot(y, ylab = ylab)}

这看上去比较直接,但是 y 标签变成了一个比较难看的 c(…) 表达式。 这是由于悠闲求值的规则导致在y修改后 ylab表达式的求值。 解决方法是首先强制 ylab求值,即:

 logplot <- function(y, ylab = deparse(substitute(y))) {ylaby <- log(y)plot(y, ylab = ylab)}

注意,这种情况下,eval(ylab)可能很少使用。如果 ylab 是一个语言或表达式对象,那么这将导致 这些对象也被求值。但有时结果不是期望的,如传递的数学表达式 是quote(loge)。

substitute 的一个变种是 bquote,它把一些子 表达式的值代替它们自己。 上面的例子可以如下

 > plot(0)> for (i in 1:4)+   text(1, 0.2 * i,+        substitute(x[ix] == y, list(ix = i, y = pnorm(i))))

也可以更简洁的写成

 plot(0)for(i in 1:4)text(1, 0.2*i, bquote( x[.(i)] == .(pnorm(i)) ))

除了.()子表达式的内容被它们的值替换外,其它表达式都被引用。 有一个可选的参数计算其它不同环境中的值。 bquote的语法源自 LISP 的后置引用(backquote)宏。

R语言 substitute相关推荐

  1. R语言 表达式对象的求值 eval

    R语言 表达式对象的求值 eval 模式为 "expression"的对象在Expression objects 有具体定义.它们和引用对象的列表非常相似. > ex < ...

  2. R语言:表达式、数学公式、特殊符号

      在R语言的绘图函数中,如果文本参数是合法的R语言表达式,那么这个表达式就被用Tex类似的规则进行文本格式化. y <- function(x) (exp(-(x^2)/2))/sqrt(2* ...

  3. R语言中的表达式函数

    狭义表达式指表达式(expression)类对象,由expression函数产生:而广义的表达式既包含expression类,也包含R"语言"类(language).express ...

  4. 《R语言与数据挖掘》⑤高级绘图工具【lattice包】【ggplot2】【交互式】

    书籍:<R语言与数据挖掘> 作者:张良均 出版社:机械工业出版社 ISBN:9787111540526 本书由北京华章图文信息有限公司授权杭州云悦读网络有限公司电子版制作与发行 版权所有· ...

  5. R语言向图像中添加LaTeX风格数学公式

    文章目录 一.添加数学公式 二.在表达式中代入变量的值 一.添加数学公式 使用 R 语言自带的 text 函数即可,用法如下: text(x, y, expression(...)) 其中函数 exp ...

  6. AR模型的R语言实现

    本模型存在问题.AIC那边始终计算不对..可能AIC函数有错?但其他检查后都是对的.能够验证均值回转定理. 参数估计+定阶 自协方差函数 根据 首先计算自协方差函数 AutoCov<-funct ...

  7. 基于划分的聚类----K-means算法使用(R语言)

    library(amap)#这个包里有kmeans函数 library(R2SWF) library(animation)#导入包,后两个是作动画的包 customer <- read.csv( ...

  8. R语言系统教程(七):数据的分布(含多种图的绘制)

    R语言系统教程(七):数据的分布 7.1 分布函数 7.2 直方图.经验分布图与QQ图 7.2.1 直方图 7.2.2 核密度估计函数 7.2.3 经验分布 7.2.4 QQ图 7.3 茎叶图.箱线图 ...

  9. python语言入门r_小结:jieba分词的Python与R语言基础用法介绍

    当前浏览器不支持播放音乐或语音,请在微信或其他浏览器中播放 人们说话不是一个词一个词崩出来的,文章也就由句子组成.要想让机器识别美文,体会中华名族汉语的博大精深,不是不可能.但是,首先需要将其转化成其 ...

最新文章

  1. S4 Smartforms 改为WORD编辑器
  2. C#中MySQL语句带参数的模糊匹配问题
  3. java中class.forname连接mysql数据库_数据库链接与 Class.forName()用法详解
  4. 【Auto.js】[zip压缩] 将文件夹压缩成zip包
  5. for循环批量写文件 shell_shell之for循环的3个简单脚本
  6. Sprng boot(十三):Spring boot 小技巧
  7. 03-sizeof的用法
  8. QML笔记-使用Row的时候要注意的地方(一定要指明高度和宽度)
  9. 文本框仅可接收decimal
  10. Jquery第二篇【选择器、DOM相关API、事件API】
  11. 设计测试用例的7点原则
  12. android banner的比例,Android_首页Banner的封装
  13. [软件更新]gladder2.0.3.3
  14. Linux系统搭建房卡游戏教程,2020年H5电玩房卡游戏源码合集运营级:超强后台控制+部署教程文档...
  15. win10系统如何打开telnet服务器,win10系统安装并开启Telnet服务的处理步骤
  16. java水彩画效果滤镜,PS通过滤镜给照片制作水彩画效果
  17. pdf在线免费去水印 以及图片去水印 方法
  18. Java 12 新特性
  19. msl3等级烘烤时间_MSL等级
  20. 【前端教程】前端要懂的色域知识

热门文章

  1. 用优盘装系统看不到计算机本身的硬盘,给电脑装系统!的时候找不到硬盘只能看到u盘数据我怀疑硬盘坏了主机? 爱问知识人...
  2. 山西大学生计算机设计大赛,2017中国大学生计算机设计大赛山西赛区决赛在中北大学成功举办...
  3. Linux进阶 | ❤Docker+NFS+Volume实现数据一致性❤
  4. 26、流程引擎API
  5. uoj problem 11 ydc的大树
  6. 关于java文件乱码解决
  7. 360全景偏移调整_360全景拼接之调水平
  8. Eventide发布Physion Mk II声音结构分离多效果插件
  9. 大数据基础(三):​​​​​​​​​​​​​​​​​​​​​大数据应用场景
  10. 浙大毕业演讲 --- 马一浮