pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

詳解R語言中的表達式、數學公式、特殊符號

這篇文章主要介紹了詳解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語言表達式、數學公式、特殊符號內容請搜索html5模板網以前的文章希望大家以后多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

主站蜘蛛池模板: AGV叉车|无人叉车|AGV智能叉车|AGV搬运车-江西丹巴赫机器人股份有限公司 | 广东教师资格网-广东教师资格证考试网 | 艾默生变频器,艾默生ct,变频器,ct驱动器,广州艾默生变频器,供水专用变频器,风机变频器,电梯变频器,艾默生变频器代理-广州市盟雄贸易有限公司官方网站-艾默生变频器应用解决方案服务商 | 高防护蠕动泵-多通道灌装系统-高防护蠕动泵-www.bjhuiyufluid.com慧宇伟业(北京)流体设备有限公司 | 搜活动房网—活动房_集装箱活动房_集成房屋_活动房屋 | 菲希尔X射线测厚仪-菲希尔库伦法测厚仪-无锡骏展仪器有限责任公司 | 耐磨陶瓷管道_除渣器厂家-淄博浩瀚陶瓷科技有限公司 | 广东泵阀展|阀门展-广东国际泵管阀展览会 | MES系统工业智能终端_生产管理看板/安灯/ESOP/静电监控_讯鹏科技 | 深圳办公室装修,办公楼/写字楼装修设计,一级资质 - ADD写艺 | 施工围挡-施工PVC围挡-工程围挡-深圳市旭东钢构技术开发有限公司 | 热缩管切管机-超声波切带机-织带切带机-无纺布切布机-深圳市宸兴业科技有限公司 | 锤式粉碎机,医药粉碎机,锥式粉碎机-无锡市迪麦森机械制造有限公司 | 活性氧化铝球|氧化铝干燥剂|分子筛干燥剂|氢氧化铝粉-淄博同心材料有限公司 | 气力输送设备_料封泵_仓泵_散装机_气化板_压力释放阀-河南锐驰机械设备有限公司 | 济南展厅设计施工_数字化展厅策划设计施工公司_山东锐尚文化传播有限公司 | CTP磁天平|小电容测量仪|阴阳极极化_双液系沸点测定仪|dsj电渗实验装置-南京桑力电子设备厂 | 贵州成人高考网_贵州成考网 | 烘箱-工业烘箱-工业电炉-实验室干燥箱 - 苏州华洁烘箱制造有限公司 | 汽液过滤网厂家_安平县银锐丝网有限公司 | 一航网络-软件测评官网| 焦作网 WWW.JZRB.COM | 鲁尔圆锥接头多功能测试仪-留置针测试仪-上海威夏环保科技有限公司 | 12cr1mov无缝钢管切割-15crmog无缝钢管切割-40cr无缝钢管切割-42crmo无缝钢管切割-Q345B无缝钢管切割-45#无缝钢管切割 - 聊城宽达钢管有限公司 | 济南网站策划设计_自适应网站制作_H5企业网站搭建_济南外贸网站制作公司_锐尚 | 行业分析:提及郑州火车站附近真有 特殊按摩 ?2025实地踩坑指南 新手如何避坑不踩雷 | 厦门网站建设_厦门网站设计_小程序开发_网站制作公司【麦格科技】 | 快速门厂家批发_PVC快速卷帘门_高速门_高速卷帘门-广州万盛门业 快干水泥|桥梁伸缩缝止水胶|伸缩缝装置生产厂家-广东广航交通科技有限公司 | 钢绞线万能材料试验机-全自动恒应力两用机-混凝土恒应力压力试验机-北京科达京威科技发展有限公司 | 江苏密集柜_电动_手动_移动_盛隆柜业江苏档案密集柜厂家 | 珠宝展柜-玻璃精品展柜-首饰珠宝展示柜定制-鸿钛展柜厂家 | 臻知网大型互动问答社区-你的问题将在这里得到解答!-无锡据风网络科技有限公司 | 水冷散热器_水冷电子散热器_大功率散热器_水冷板散热器厂家-河源市恒光辉散热器有限公司 | 磁力轮,磁力联轴器,磁齿轮,钕铁硼磁铁-北京磁运达厂家 | 超声波清洗机_超声波清洗机设备_超声波清洗机厂家_鼎泰恒胜 | 上海电子秤厂家,电子秤厂家价格,上海吊秤厂家,吊秤供应价格-上海佳宜电子科技有限公司 | 灌装封尾机_胶水灌装机_软管灌装封尾机_无锡和博自动化机械制造有限公司 | 北京租车公司_汽车/客车/班车/大巴车租赁_商务会议/展会用车/旅游大巴出租_北京桐顺创业租车公司 | 成都治疗尖锐湿疣比较好的医院-成都治疗尖锐湿疣那家医院好-成都西南皮肤病医院 | 大型低温冷却液循环泵-低温水槽冷阱「厂家品牌」京华仪器_京华仪器 | 新能源汽车教学设备厂家报价[汽车教学设备运营18年]-恒信教具 |