下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

R语言进阶之5:表达式、数学公式与特殊符号的讲解

作者:课课家     来源: www.kokojia.com点击数:5897发布时间: 2015-11-02 11:36:09

标签: 编程语言大数据视频教程大数据视频

  1. 在众多学习中,文章也许不起眼,但是重要的下面我们就来讲解一下!!
  2. lot(y, 1, 1000, main = expression(y == log(x) + sqrt(x) + sqrt(x, 3)), lwd = 3,  
  3.    col = "blue") 


一、R语言的“表达式”
在R语言中,“表达式”的概念有狭义和广义两种意义。狭义的表达式指表达式(expression)类对象,由expression函数产生;而广义的的表达式既包含expression类,也包含R“语言”类(language)。expression和language是R语言中两种特殊数据类:

  1. getClass("expression") oracle教程
  2. ## Class "expression" [package "methods"] 
  3. ##  
  4. ## No Slots, prototype of class "expression" 
  5. ##  
  6. ## Extends: "vector" 
  7. getClass("language") 
  8. ## Virtual Class "language" [package "methods"] 
  9. ##  
  10. ## No Slots, prototype of class "name" 
  11. ##  
  12. ## Known Subclasses:  
  13. ## Class "name", directly 
  14. ## Class "call", directly 
  15. ## Class "{", directly 
  16. ## Class "if", directly 
  17. ## Class "<-", directly 
  18. ## Class "for", directly 
  19. ## Class "while", directly 
  20. ## Class "repeat", directly 
  21. ## Class "(", directly 
  22. ## Class ".name", by class "name", distance 2, with explicit coerce 

可以看到expression类由向量派生得到,而language类是虚拟类,它包括我们熟悉的程序控制关键词/符号和name、call 子类。
二、产生“表达式”的函数
虽然我们在R终端键入的任何有效语句都是表达式,但这些表达式在输入后即被求值(evaluate)了,获得未经求值的纯粹“表达式”就要使用函数。下面我们从函数参数和返回值两方面了解expression、quote、bquote和substitute这几个常用函数。
1、expression 函数
expression函数可以有一个或多个参数,它把全部参数当成一个列表,每个参数都被转成一个表达式向量,所以它的返回值是表达式列表,每个元素都是表达式类型对象,返回值的长度等于参数的个数:

  1. (ex 
  2. ## expression(x = 1, 1 + sqrt(a)) 
  3. length(ex) 
  4. ## [1] 2 
  5. ex[1] 
  6. ## expression(x = 1) 
  7. mode(ex[1]) 
  8. ## [1] "expression" 
  9. typeof(ex[1]) 
  10. ## [1] "expression" 
  11. ex[2] 
  12. ## expression(1 + sqrt(a)) 
  13. mode(ex[2]) 
  14. ## [1] "expression" 
  15. typeof(ex[2]) 
  16. ## [1] "expression" 

因为expression函数把参数当成列表处理,所以等号‘=’两边的表达式要符合R语言列表元素的书写规则,否则出错,比如:

  1. expression(x+11=1) 

2、quote函数
quote函数只能有一个参数。quote函数的返回值一般情况下是call类型,表达式参数是单个变量的话返回值就是name类型,如果是常量那么返回值的存储模式就和相应常量的模式相同:

  1. (cl 
  2. ## 1 + sqrt(a) + b^c 
  3. mode(cl) 
  4. ## [1] "call" 
  5. typeof(cl) 
  6. ## [1] "language" 
  7. (cl 
  8. ## a 
  9. mode(cl) 
  10. ## [1] "name" 
  11. typeof(cl) 
  12. ## [1] "symbol" 
  13. (cl 
  14. ## [1] 1 
  15. mode(cl) oracle视频教程
  16. ## [1] "numeric" 
  17. typeof(cl) 
  18. ## [1] "double" 

quote返回值如果是name或常量类型,它的长度就是1;如果是call类型,返回值长度就与函数/运算符的参数个数n对应,长度等于n+1,多出的长度1是函数/符号名。

  1. length(quote(a))  #name或常量类型,返回值长度为1 
  2. ## [1] 1 
  3. length(quote(!a))  #单目运算符,返回值长度为2 
  4. ## [1] 2 
  5. length(quote(-b))  #单目运算符,返回值长度为2 
  6. ## [1] 2 
  7. length(quote(a + b))  #双目运算符,返回值长度为3 
  8. ## [1] 3 
  9. length(quote((a + b) * c))  #多个运算符只算优先级最低的一个 
  10. ## [1] 3 

3、bquote 和 substitute 函数
如果不使用环境变量或环境变量参数,bquote 和 substitute 函数得到的结果与quote函数相同。

  1. bquote(1 + sqrt(a) + b^c) == quote(1 + sqrt(a) + b^c) 
  2. ## [1] TRUE 
  3. substitute(1 + sqrt(a) + b^c) == quote(1 + sqrt(a) + b^c) 
  4. ## [1] TRUE 

但是bquote 和 substitute 函数可以在表达式中使用变量,变量的值随运行进程而被替换。bquote 和 substitute 函数变量替换的方式不一样,bquote函数中需要替换的变量用 .( ) 引用,substitute函数中需要替换的变量用列表参数方式给出。除了这一点,bquote 和 substitute 函数没有差别:

  1. (bq 
  2. ## y == sqrt(3, 2) 
  3. (ss 
  4. ## y == sqrt(3, 2) 
  5. bq == ss 
  6. ## [1] TRUE 

搞出两个功能完全一样的函数不算很奇怪,R语言里面太多了,可能是照顾不同使用习惯的人们吧。bquote函数的帮助档说这个函数类似于LISP的backquote宏,对于像我这样的LISP盲,使用substitute函数好一些。 substitute函数的典型用途是替换表达式中的变量,如果我们希望在表达式中使用变量并且希望这些变量在运行过程中做出相应改变,就可以使用substitute函数。

  1. par(mar = rep(0.1, 4), cex = 2) 
  2. plot.new() 
  3. plot.window(c(0, 10), c(0, 1)) 
  4. for (i in 1:9) text(i, 0.5, substitute(sqrt(x, a), list(a = i + 1))) 

 

4、parse 函数

parse函数用于从文件读取文本作为表达式,返回的值是expression类型,这函数也很有用。后面有例子。
三、表达式规则与paste函数:
与在R终端直接输入的表达式不一样,expression、quote、bquote和substitute等函数对参数中的(变量)名称都不做任何检查:

  1. x + "x" 
  2. ## Error: 二进列运算符中有非数值参数 
  3. expression(x + "x") 
  4. ## expression(x + "x") 
  5. quote(x + "x") 
  6. ## x + "x" 

但R要检查表达式中的运算符,不符合运算符使用规则的表达式将出错:

  1. expression(x + +++y) 
  2. ## expression(x + +++y) 
  3. expression(x - ---y) 
  4. ## expression(x - ---y) 
  5. # expression(x****y) (Not run) expression(x////y) (Not run) 
  6. # expression(1<=x<=4) (Not run) 
  7. quote(x + +++y) 
  8. ## x + +++y 
  9. quote(x - ---y) 
  10. ## x - ---y 
  11. # quote(x****y) (Not run) quote(x////y) (Not run) quote(1<=x<=4) (Not run) 

+ - 运算连续使用不出错是因为它们还可以当成求正/负值运算的符号。 在表达式产生函数中使用paste函数可以解决这样的问题。在这种条件下,paste对参数的处理方式和表达式产生函数一样,检查运算符但不检查变量名。用NULL作为运算符的参数可以获得意外的效果:

 
  1. ex 
  2. cl 
  3. par(mar = rep(0.1, 4), cex = 2) 
  4. plot.new() 
  5. plot.window(c(0, 1.2), c(0, 1)) 
  6. text(0.2, 0.5, ex) 
  7. text(0.6, 0.5, cl) 
  8. cl 
  9. text(1, 0.5, cl) 

 

经李克强总理签批,2015年9月,国务院印发《促进大数据发展行动纲要》(以下简称《纲要》),系统部署大数据发展工作。
《纲要》明确,推动大数据发展和应用,在未来5至10年打造精准治理、多方协作的社会治理新模式,建立运行平稳、安全高效的经济运行新机制,构建以人为本、惠及全民的民生服务新体系,开启大众创业、万众创新的创新驱动新格局,培育高端智能、新兴繁荣的产业发展新生态。
《纲要》部署三方面主要任务。一要加快政府数据开放共享,推动资源整合,提升治理能力。大力推动政府部门数据共享,稳步推动公共数据资源开放,统筹规划大数据基础设施建设,支持宏观调控科学化,推动政府治理精准化,推进商事服务便捷化,促进安全保障高效化,加快民生服务普惠化。二要推动产业创新发展,培育新兴业态,助力经济转型。发展大数据在工业、新兴产业、农业农村等行业领域应用,推动大数据发展与科研创新有机结合,推进基础研究和核心技术攻关,形成大数据产品体系,完善大数据产业链。三要强化安全保障,提高管理水平,促进健康发展。健全大数据安全保障体系,强化安全支撑。[11] 
2015年9月18日贵州省启动我国首个大数据综合试验区的建设工作,力争通过3至5年的努力,将贵州大数据综合试验区建设成为全国数据汇聚应用新高地、综合治理示范区、产业发展聚集区、创业创新首选地、政策创新先行区。
围绕这一目标,贵州省将重点构建“三大体系”,重点打造“七大平台”,实施“十大工程”。oracle视频
“三大体系”是指构建先行先试的政策法规体系、跨界融合的产业生态体系、防控一体的安全保障体系;“七大平台”则是指打造大数据示范平台、大数据集聚平台、大数据应用平台、大数据交易平台、大数据金融服务平台、大数据交流合作平台和大数据创业创新平台;“十大工程”即实施数据资源汇聚工程、政府数据共享开放工程、综合治理示范提升工程、大数据便民惠民工程、大数据三大业态培育工程、传统产业改造升级工程、信息基础设施提升工程、人才培养引进工程、大数据安全保障工程和大数据区域试点统筹发展工程。
此外,贵州省将计划通过综合试验区建设,探索大数据应用的创新模式,培育大数据交易新的做法,开展数据交易的市场试点,鼓励产业链上下游之间的数据交换,规范数据资源的交易行为,促进形成新的业态。
国家发展改革委有关专家表示,大数据综合试验区建设不是简单的建产业园、建数据中心、建云平台等,而是要充分依托已有的设施资源,把现有的利用好,把新建的规划好,避免造成空间资源的浪费和损失。探索大数据应用新的模式,围绕有数据、用数据、管数据,开展先行先试,更好地服务国家大数据发展战略。


四、R绘图函数对文本参数中的表达式的处理
quote, bquote 和 substitute 的返回值有三种类型call, name 和 常量,事实上expression 函数的结果最终也是这三种类型。因为expression函数的结果是expression列表,我们取列表元素的值检查看看:

 
  1. (ex 
  2. ## expression(1 + sqrt(x), x, 1) 
  3. ex[[1]] 
  4. ## 1 + sqrt(x) 
  5. mode(ex[[1]]) 
  6. ## [1] "call" 
  7. typeof(ex[[1]]) 
  8. ## [1] "language" 
  9. ex[[2]] 
  10. ## x 
  11. mode(ex[[2]]) 
  12. ## [1] "name" 
  13. typeof(ex[[2]]) 
  14. ## [1] "symbol" 
  15. ex[[3]] 
  16. ## [1] 1 
  17. mode(ex[[3]]) 
  18. ## [1] "numeric" 
  19. typeof(ex[[3]]) 
  20. ## [1] "double" 
确实是这样。所以绘图函数对文本参数中的表达式处理就有三种情况。先看看处理结果:
  1. par(mar = rep(0.1, 4), cex = 2) 
  2. plot.new() 
  3. plot.window(c(0, 1.2), c(0, 1)) 
  4. text(0.2, 0.5, ex[1]) 
  5. text(0.6, 0.5, ex[2]) 
  6. text(1, 0.5, ex[3]) 

name 和常量类型都很简单,直接输出文本,而call类型就不好判断了。我们前面说过call类型返回值的长度与函数/运算符的参数个数有关。这是怎么体现的呢?由于文本参数最终得到的是文本,我们用as.character函数来看看:

  1. as.character(quote(x - y)) 
  2. ## [1] "-" "x" "y" 
  3. as.character(quote(1 - x + y)) 
  4. ## [1] "+"     "1 - x" "y" 
  5. as.character(quote((1 + x) * y)) 
  6. ## [1] "*"       "(1 + x)" "y" 
  7. as.character(quote(!a)) 
  8. ## [1] "!" "a" 
  9. as.character(quote(sqrt(x))) 
  10. ## [1] "sqrt" "x" 

转换成字符串向量后排在第一位的是运算符或函数名称,后面是参数(如果参数中还有运算符或函数名,R还会对其进行解析)。运算符和函数是相同的处理方式。事实上,在R语言中,所有运算符(包括数**算符和逻辑运算符)都是函数,你可以用函数的方式使用运算符:
oracle数据库教程

 
  1. 2 + 4 
  2. ## [1] 6 
  3. 2 - 4 
  4. ## [1] -2 
  5. 2 <= 4 
  6. ## [1] TRUE 
  7. 2 >= 4 
  8. ## [1] FALSE 

R绘图函数对表达式中包含的函数名和它们的参数首先应用Tex文本格式化规则进行处理,这种规则的具体情况可以使用 ?plotmath 进行查看,主要是一些数学公式和符号的表示方法。把这个说明文档中字符串拷贝到maths.txt文件中并保存到当前工作目录后可以用下面的代码做出后面的表格:

 
  1. ex 
  2. labs 
  3. par(mar = rep(0.1, 4), cex = 0.8) 
  4. plot.new() 
  5. plot.window(c(0, 8), c(0, n/4)) 
  6. xy 
  7. text(xy, labs, adj = c(0, 0.5)) 
  8. xy 
  9. text(xy, ex, adj = c(0, 0.5), col = "blue") 
  10. box(lwd = 2) 
  11. abline(v = seq(1.3, by = 2, length = 4), lty = 3) 
  12. abline(v = seq(2, by = 2, length = 3), lwd = 1.5) 



 表中奇数列是字符串(表达式),偶数列(蓝色)是Tex格式化的图形。除了上表列出的规则外还有一些拉丁文和希腊文符号,可以在表达式中用 symbol 函数或名称(如alpha)等表示,用到时自己去找吧。 如果函数名(包括运算符)有对应的Tex格式化规则,函数名和参数都按规则进行图形绘制;如果没有,就当成是R语言普通函数:

  1. ex 
  2.     x & y) 
  3. par(mar = rep(0.1, 4), cex = 1.5) 
  4. col 
  5. plot.new() 
  6. plot.window(c(0, n), c(0, 1)) 
  7. for (i in 1:n) text(i - 0.5, 0.5, ex[i], colcol = col[i%%2 + 1]) 


上面例子中前5种运算函数都是有对应数学符号的,所以它出的图(符号和顺序)与数学习惯一致,后三种运算函数没有对应数学符号,所以用普通函数方式(函数名在前,参数在括号内用逗号分隔)出图。其他还有一些琐碎的规则,自己找找吧。
更多视频课程文章的课程,可到课课家官网查看。我在等你哟!!!

赞(110)
踩(2)
分享到:
华为认证网络工程师 HCIE直播课视频教程