我的编程空间,编程开发者的网络收藏夹
学习永远不晚

详解R语言中的表达式、数学公式、特殊符号

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

详解R语言中的表达式、数学公式、特殊符号

  在R语言的绘图函数中,如果文本参数是合法的R语言表达式,那么这个表达式就被用Tex类似的规则进行文本格式化。


y <- function(x) (exp(-(x^2)/2))/sqrt(2*pi)

plot(y, -5, 5, main = expression(f(x) == frac(1,sqrt(2*pi))*e^(-frac(x^2,2))), lwd = 3, col = "blue")

这里写图片描述


library(ggplot2)

x <- seq(0, 2*pi, by = 0.01)
y <- sin(x)
data <- data.frame(x, y)
p <- ggplot(data, aes(x, y)) + geom_line()

p + geom_area(fill = 'blue', alpha = 0.3) +
 scale_x_continuous(breaks = c(0, pi, 2*pi), labels = c('0', expression(pi), expression(2*pi))) +
 geom_text(parse = T, aes(x = pi/2,y = 0.3, label = 'integral(sin(x)*dx, 0, pi)'))

这里写图片描述

##一、R语言的“表达式”

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

getClass(“expression”)


# Class "expression" [package "methods"]

# No Slots, prototype of class "expression"

# Extends: "vector"

getClass(“language”)


# Virtual Class "language" [package "methods"]

# No Slots, prototype of class "name"

# Known Subclasses: 
# Class "name", directly
# Class "call", directly
# Class "{", directly
# Class "if", directly
# Class "<-", directly
# Class "for", directly
# Class "while", directly
# Class "repeat", directly
# Class "(", directly
# Class ".name", by class "name", distance 2, with explicit coerce

可以看到expression类由向量派生得到,而language类是虚拟类,它包括我们熟悉的程序控制关键词/符号和name、call 子类。

##二、产生“表达式”的函数

虽然我们在R终端键入的任何有效语句都是表达式,但这些表达式在输入后即被求值(evaluate)了,获得未经求值的纯粹“表达式”就要使用函数。下面我们从函数参数和返回值两方面了解expression、quote、bquote和substitute这几个常用函数。

####1、expression 函数

expression函数可以有一个或多个参数,它把全部参数当成一个列表,每个参数都被转成一个表达式向量,所以它的返回值是表达式列表,每个元素都是表达式类型对象,返回值的长度等于参数的个数:


(ex <- expression(x = 1, 1 + sqrt(a)))

## expression(x = 1, 1 + sqrt(a))

length(ex)

## [1] 2

ex[1]

## expression(x = 1)

mode(ex[1])

## [1] "expression"

typeof(ex[1])

## [1] "expression"

ex[2]

## expression(1 + sqrt(a))

mode(ex[2])

## [1] "expression"

typeof(ex[2])

## [1] "expression" 

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


expression(x+11=1)

####2、quote函数

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


(cl <- quote(1 + sqrt(a) + b^c))
## 1 + sqrt(a) + b^c

mode(cl)
## [1] "call"

typeof(cl)
## [1] "language"

(cl <- quote(a))
## a

mode(cl)
## [1] "name"

typeof(cl)
## [1] "symbol"

(cl <- quote(1))
## [1] 1

mode(cl)
## [1] "numeric"

typeof(cl)
## [1] "double" 

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


length(quote(a)) #name或常量类型,返回值长度为1
## [1] 1

length(quote(!a)) #单目运算符,返回值长度为2
## [1] 2

length(quote(-b)) #单目运算符,返回值长度为2
## [1] 2

length(quote(a + b)) #双目运算符,返回值长度为3
## [1] 3

length(quote((a + b) * c)) #多个运算符只算优先级最低的一个
## [1] 3 

####3、bquote 和 substitute 函数

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


bquote(1 + sqrt(a) + b^c) == quote(1 + sqrt(a) + b^c)
## [1] TRUE

substitute(1 + sqrt(a) + b^c) == quote(1 + sqrt(a) + b^c)
## [1] TRUE 

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


a <- 3

b <- 2

(bq <- bquote(y == sqrt(.(a), .(b))))
## y == sqrt(3, 2) 

(ss <- substitute(y == sqrt(a, b), list(a = 3, b = 2)))
## y == sqrt(3, 2) 

bq == ss
## [1] TRUE 

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


par(mar = rep(0.1, 4), cex = 2)

plot.new()

plot.window(c(0, 10), c(0, 1))

for (i in 1:9) text(i, 0.5, substitute(sqrt(x, a), list(a = i + 1))) 

这里写图片描述

####4、parse 函数

parse函数用于从文件读取文本作为表达式,返回的值是expression类型,这函数也很有用。后面有例子。


x <- 1

x + "x"

## Error: 二进列运算符中有非数值参数

expression(x + "x")

## expression(x + "x")

quote(x + "x")

## x + "x" 

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


expression(x + +++y)
## expression(x + +++y) 

expression(x - ---y)
## expression(x - ---y) 
## expression(x****y) (Not run) expression(xy) (Not run) 
## expression(1<=x<=4) (Not run) 

quote(x + +++y)
## x + +++y 

quote(x - ---y)
## x - ---y 
## quote(x****y) (Not run) quote(xy) (Not run) quote(1<=x<=4) (Not run) 

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


ex <- expression(paste(x, "", y))

cl <- quote(paste(x, "****", y))

par(mar = rep(0.1, 4), cex = 2)

plot.new()

plot.window(c(0, 1.2), c(0, 1))

text(0.2, 0.5, ex)

text(0.6, 0.5, cl)

cl <- quote(paste(1 <= x, NULL <= 4))

text(1, 0.5, cl) 

这里写图片描述

##三、R绘图函数对文本参数中的表达式的处理

quote, bquote 和 substitute 的返回值有三种类型call, name 和 常量,事实上expression 函数的结果最终也是这三种类型。因为expression函数的结果是expression列表,我们取列表元素的值检查看看:


(ex <- expression(1 + sqrt(x), x, 1))
## expression(1 + sqrt(x), x, 1)

ex[[1]]
## 1 + sqrt(x)

mode(ex[[1]])
## [1] "call"

typeof(ex[[1]])
## [1] "language"

ex[[2]]
## x

mode(ex[[2]])
## [1] "name"

typeof(ex[[2]])
## [1] "symbol"

ex[[3]]
## [1] 1

mode(ex[[3]])
## [1] "numeric"

typeof(ex[[3]])
## [1] "double" 

确实是这样。所以绘图函数对文本参数中的表达式处理就有三种情况。先看看处理结果:


par(mar = rep(0.1, 4), cex = 2)

plot.new()

plot.window(c(0, 1.2), c(0, 1))

text(0.2, 0.5, ex[1])

text(0.6, 0.5, ex[2])

text(1, 0.5, ex[3])

这里写图片描述

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


as.character(quote(x - y))
## [1] "-" "x" "y"

as.character(quote(1 - x + y))
## [1] "+" "1 - x" "y"

as.character(quote((1 + x) * y))
## [1] "*" "(1 + x)" "y"

as.character(quote(!a))
## [1] "!" "a"

as.character(quote(sqrt(x)))
## [1] "sqrt" "x" 

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


2 + 4
## [1] 6

2 - 4
## [1] -2

2 <= 4
## [1] TRUE

2 >= 4
## [1] FALSE 

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


ex <- parse("maths.txt")

labs <- readLines("maths.txt")

n <- length(ex)

par(mar = rep(0.1, 4), cex = 0.8)

plot.new()

plot.window(c(0, 8), c(0, n/4))

y <- seq(n/4, by = -1, length = n/4)

x <- seq(0.1, by = 2, length = 4)

xy <- expand.grid(x, y)

text(xy, labs, adj = c(0, 0.5))

xy <- expand.grid(x + 1.3, y)

text(xy, ex, adj = c(0, 0.5), col = "blue")

box(lwd = 2)

abline(v = seq(1.3, by = 2, length = 4), lty = 3)

abline(v = seq(2, by = 2, length = 3), lwd = 1.5) 

这里写图片描述

右键查看图片,浏览大图

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


ex <- expression(sqrt(x), x + y, x^2, x %in% A, x <= y, mean(x, y, z), x | y, x & y)

n <- length(ex)

par(mar = rep(0.1, 4), cex = 1.5)

col <- c("red", "blue")

plot.new()

plot.window(c(0, n), c(0, 1))

for (i in 1:n) text(i - 0.5, 0.5, ex[i], col = col[i%%2 + 1]) 

这里写图片描述

上面例子中前5种运算函数都是有对应数学符号的,所以它出的图(符号和顺序)与数学习惯一致,后三种运算函数没有对应数学符号,所以用普通函数方式(函数名在前,参数在括号内用逗号分隔)出图。其他还有一些琐碎的规则,自己找找吧。

到此这篇关于详解R语言中的表达式、数学公式、特殊符号的文章就介绍到这了,更多相关R语言表达式、数学公式、特殊符号内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

详解R语言中的表达式、数学公式、特殊符号

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Linux中的特殊符号与正则表达式

第1章 linux的特殊符号 1.1 通配符 * {} 1.1.1 含义 方便查找文件 通配符是用来找文件名字的。 1.1.2 * 通过find 命令找以 .sh 结尾的文件,使用*替代文件名字。find /oldboy -type f
2022-06-04

Linux中特殊符号与正则表达式的示例分析

这篇文章主要介绍了Linux中特殊符号与正则表达式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。第1章 linux的特殊符号1.1 通配符 * {}1.1.1 含义
2023-06-09

Flex正则表达式中一些代表抽象意义的特殊符号的作用

这篇文章主要讲解了“Flex正则表达式中一些代表抽象意义的特殊符号的作用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Flex正则表达式中一些代表抽象意义的特殊符号的作用”吧!Flex正则表
2023-06-17

PHP中的preg_quote()函数:如何将字符串中的特殊字符转义为正则表达式字符

PHP中的preg_quote()函数:如何将字符串中的特殊字符转义为正则表达式字符,需要具体代码示例在开发中,我们经常会使用到正则表达式来匹配和处理字符串。然而,有些字符串中可能含有一些特殊字符,比如正则表达式中的元字符,它们具有特殊的意
PHP中的preg_quote()函数:如何将字符串中的特殊字符转义为正则表达式字符
2023-11-04

学习Go语言文档中的regexp.MatchString函数实现正则表达式匹配

学习Go语言文档中的regexp.MatchString函数实现正则表达式匹配简介正则表达式是一种强大的工具,用来匹配和操作字符串。在Go语言中,我们可以使用内置的regexp包来处理正则表达式。其中的MatchString函数可以用来判断
学习Go语言文档中的regexp.MatchString函数实现正则表达式匹配
2023-11-03

学习Go语言文档中的regexp.MustCompile函数实现正则表达式匹配

学习Go语言文档中的regexp.MustCompile函数实现正则表达式匹配正则表达式(Regular Expression)是一种用于匹配、搜索、替换字符串的强大工具。在Go语言中,使用regexp包提供了对正则表达式的支持。其中的Mu
学习Go语言文档中的regexp.MustCompile函数实现正则表达式匹配
2023-11-03

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录