- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章详解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语言中,“表达式”的概念有狭义和广义两种意义。狭义的表达式指表达式(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这几个常用函数.
expression函数可以有一个或多个参数,它把全部参数当成一个列表,每个参数都被转成一个表达式向量,所以它的返回值是表达式列表,每个元素都是表达式类型对象,返回值的长度等于参数的个数:
(ex <- expression(x = 1, 1 + sqrt(a)))## expression(x = 1, 1 + sqrt(a))length(ex)## [1] 2ex[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)
quote函数只能有一个参数。quote函数的返回值一般情况下是call类型,表达式参数是单个变量的话返回值就是name类型,如果是常量那么返回值的存储模式就和相应常量的模式相同:
(cl <- quote(1 + sqrt(a) + b^c))## 1 + sqrt(a) + b^cmode(cl)## [1] "call"typeof(cl)## [1] "language"(cl <- quote(a))## amode(cl)## [1] "name"typeof(cl)## [1] "symbol"(cl <- quote(1))## [1] 1mode(cl)## [1] "numeric"typeof(cl)## [1] "double"
quote返回值如果是name或常量类型,它的长度就是1;如果是call类型,返回值长度就与函数/运算符的参数个数n对应,长度等于n+1,多出的长度1是函数/符号名.
length(quote(a)) #name或常量类型,返回值长度为1## [1] 1length(quote(!a)) #单目运算符,返回值长度为2## [1] 2length(quote(-b)) #单目运算符,返回值长度为2## [1] 2length(quote(a + b)) #双目运算符,返回值长度为3## [1] 3length(quote((a + b) * c)) #多个运算符只算优先级最低的一个## [1] 3
如果不使用环境变量或环境变量参数,bquote 和 substitute 函数得到的结果与quote函数相同.
bquote(1 + sqrt(a) + b^c) == quote(1 + sqrt(a) + b^c)## [1] TRUEsubstitute(1 + sqrt(a) + b^c) == quote(1 + sqrt(a) + b^c)## [1] TRUE
但是bquote 和 substitute 函数可以在表达式中使用变量,变量的值随运行进程而被替换。bquote 和 substitute 函数变量替换的方式不一样,bquote函数中需要替换的变量用 .( ) 引用,substitute函数中需要替换的变量用列表参数方式给出。除了这一点,bquote 和 substitute 函数没有差别:
a <- 3b <- 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)))
parse函数用于从文件读取文本作为表达式,返回的值是expression类型,这函数也很有用。后面有例子.
x <- 1x + "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)
。
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]]## xmode(ex[[2]])## [1] "name"typeof(ex[[2]])## [1] "symbol"ex[[3]]## [1] 1mode(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] 62 - 4## [1] -22 <= 4## [1] TRUE2 >= 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语言表达式、数学公式、特殊符号内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/songzhilian22/article/details/49487467 。
最后此篇关于详解R语言中的表达式、数学公式、特殊符号的文章就讲到这里了,如果你想了解更多关于详解R语言中的表达式、数学公式、特殊符号的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
给定一个字符串,例如 s="##$$$#",我如何找到索引之前的“#”符号数等于“”数的索引$"符号在索引之后? 示例:如果 s="##$$$#",则输出将为 2。 解释:在索引 2 之前我们有 2
在本教程中,您将借助示例了解 JavaScript 符号。 JavaScript 符号 JavaScript ES6 引入了一种新的原始数据类型,称为 Symbol(符号)。符号是不可变的(不能更改)
在“函数编程的工艺”一书中,符号 '>.>' 将函数连接在一起,与 '.' 的方向相反。但是当我使用 ghci 实现它时,它显示了超出范围的错误 '>.>'。为什么?它是不再使用的旧符号吗? 最佳答案
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我需要从向量中删除 \"。这是我的数据: data <- c("\"https://click.linksynergy.com/link?id=RUxZriH*PWc&offerid=323058.1
我在 Nginx 配置中使用正则表达式来捕获文件 URL,但如果文件 URL 包含 # 符号,正则表达式模式将不会捕获它。 这里是nginx的配置部分。 location ~ ^/p/(?[\w\-=
如何使 & 符号在此图表的第一组条形/列下正确显示: http://jsfiddle.net/VxbrK/2/ 应该是“Apples & Oranges”而不是“Apples & Oranges”。
**在verilog中是什么意思? 我为测试台提供了以下逻辑 localparam NUM_INPUT_BITS = 1; localparam NUM_OUTPUT_BITS
我有一个使用正则表达式来验证电子邮件地址的方法。 public String searchFormail(String searchWord) { Pattern pattern = Patt
我想将一个字符串拆分为数字部分和文本/符号部分我当前的代码不包含负数或小数,并且表现得很奇怪,在输出的末尾添加了一个空列表元素 import re mystring = 'AD%5(6ag 0.33-
我有一些代码需要从数组中选择一个随机字符串,但它一直返回单个字母或数字。如何解决这个问题? var name = ["Yayek", "Vozarut", "Gezex",
我刚开始使用 Python,我在考虑应该使用哪种表示法。我读过 PEP 8关于 Python 符号的指南,我同意那里的大多数内容,除了函数名称(我更喜欢混合大小写风格)。 在 C++ 中,我使用匈牙利
在用 C# 编写代码时,我错误地在 if 语句中的变量前添加了一个符号(而不是感叹号)。 bool b = false; if (@b) { } 我很惊讶它编译成功,没有任何错误。 我想知道:上面的代
本文实例为大家分享了特殊字符替换电话号码中某一部分的方法,ios利用-号替换电话号码中间四位,供大家参考,具体内容如下 1、效果图 2、代码 rootviewcontroll
当我使用“x”和“z”作为符号时,这段代码没有问题: from sympy import * x, z = symbols('x z') y = -6*x**2 + 2*x*z**0.5 + 50*x
我需要从文本中删除标点符号: data <- "Type the command AT&W enter. in order to save the new protocol on modem;"
我有几个数字是 numeric 类。下面的例子。 df = c(12974,12412,124124,124124,34543,4576547,32235) 现在我想在每个数字前添加 '$' 符号而不
我有一个 highcharts 图例,其中符号以不同的大小显示,因为它们在实际图表中的大小不同。不幸的是,当数据点的大小增加时,它们也会在图例中增加。无论数据点大小如何,我都希望图例符号保持相同的大小
我需要使用包含平均值+-SD的标题。到目前为止,我只能得到以下信息: "Mean +- SD or N (%)" [1] "Mean +- SD or N (%)" 如何直接使用“+-”符号?您知道一
使用 XSLT 和 XPath 1.0,我有一个要转义的字符串以用于 URL,例如: one word & another 因此,描述元素的 text() 应该进行 URL 转义。 我该怎么做
我是一名优秀的程序员,十分优秀!