R语言加入HTML5编程部分,R语言基础编程技能汇编 - 26

R语言基础编程技巧汇编 - 26

1.      监视R语言包更新状态的网站

R语言包的数量已经有近万个,及时关注新发布的包,以及已发布的包的更新状态,非常重要,下列网站提供了这个功能,读者可以经常访问:

http://lib.stat.cmu.edu/R/CRAN/web/packages/available_packages_by_date.html

2.      使用命令行参数的R程序示例

以Windows系统为例,按照以下步骤:

1.把Rscript.exe的路径加入到Path环境变量中,在我的机器上设置如下:

194821563.png

2.创建名为script.R的R语言脚本文件,放在C盘根目录下,文件内容如下:

args

header

data

colnames(data)

head(data)

3.在cmd.exe窗口中键入如下命令行,即可得到脚本文件运行的结果。

194821564.png

4.可以利用命令行参数方式实现类似双击启动应用程序的效果——新建一个.bat批处理文件,内容如下:

Rscript "C:\script.R""c('col1','col2','col3')"

双击该文件,即可立即执行脚本文件。

需要注意的是,以命令行参数方式运行R脚本,无法运行需要与用户交互的脚本,比如有用户界面的脚本,只能一次性把所有参数都传递进去。

3.      利用flush.console()函数立即刷新打印结果

在R console(RStudio中没有这个问题)中执行需要打印结果的程序时,打印结果往往不能逐渐显示出来,而是要等到程序执行完了才一次性显示出来,这对于观察程序运行过程和调试代码都很不方便,而flush.console函数可以立即刷新打印结果,比如下面两段程序:

#R console在循环结束时才显示打印的结果

for (i in 1:3) {

Sys.sleep(1)

print(i)

}

#使用flush.console函数后,每次循环都会刷新打印结果

for (i in 1:3) {

Sys.sleep(1)

print(i)

flush.console()

}

4.      利用Sys.glob函数搜索电脑中的文件

Sys.glob函数可以列出某个路径下的所有文件和文件夹,并支持通配符,可以利用这个功能搜索计算机中的文件或文件夹,比如搜索C盘根目录:

Sys.glob(paths = 'C:/*')

#[1] "C:/$360Section"               "C:/$Recycle.Bin"

#[3]"C:/1b76e09a3cab8a84daf635b6"  "C:/2"

#[5]"C:/3"                         "C:/360Downloads"

#[7]"C:/360Rec"                    "C:/360SANDBOX"

#[9]"C:/360用户文件"                "C:/84d67ce49a9069e430d9e0e050"

5.       利用Vectorize函数使函数向量化

Vectorize函数是mapply函数的封装,它可以对几个向量化的参数应用某个函数。

比如

> mapply(rep.int,x = 1:3,times = 3:1)

[[1]]

[1] 1 1 1

[[2]]

[1] 2 2

[[3]]

[1] 3

表示应用rep.int函数三次:rep.int (1,3),rep.int (2,2),

rep.int (3,1),然后把结果保存在列表中。

等价的Vectorize函数表达方式为:

> vrep

> vrep(x = 1:3, times = 3:1)

[[1]]

[1] 1 1 1

[[2]]

[1] 2 2

[[3]]

[1] 3

6.       利用Rmpfr包进行大数计算

默认状态下,R语言能表示的e的幂的范围如下:

.Machine$double.min.exp

#[1] -1022

.Machine$double.max.exp

#[1] 1024

如果超过这个这个范围,则无法得出值:

exp(1025)

#[1] Inf

使用Rmpfr包则可以把数值范围扩展到无限大,比如计算e的10000次方:

library(Rmpfr)

#创建一个mpfr对象,数值为e的一次方,即e

a

#计算e的10000次方

a^10000

#1 'mpfr' number of precision  64  bits

#[1] 8.80681822565823791192e4342

7.       改变聚类树形图标签的大小

# example from ?hclust

hc

# default label size

plot(hc, xlab="xlab",ylab="ylab", main="main", sub="")

# reduced label size

par(cex=0.3, mar=c(5, 8, 4, 1))

plot(hc, xlab="",ylab="", main="", sub="", axes=FALSE)

par(cex=1)

title(xlab="xlab", ylab="ylab",main="main")

axis(2)

194821565.png

8.       lines函数封口的原因

使用lines函数画线时,有时候它会自动连接首尾点进行封口,例如:

par(mfrow=c(1, 2))

plot(x=c(-1, 0, 1), y=c(-1, 1, -1),xlim=c(-2, 2), ylim=c(-2, 2),

type="l", asp=1)

points(x=c(-1, 1), y=c(-1, -1))

plot(x=c(-1, 0, 1, -1), y=c(-1, 1, -1, -1),xlim=c(-2, 2), ylim=c(-2, 2),

type="l", asp=1)

points(x=c(-1, 1), y=c(-1, -1))

194821566.png

原因是一个坐标被使用了两次,起点和终点使用了相同的坐标,所以首尾点相连了。

9.       进行符号运算的包mosaic

R语言的符号运算能力总体来说比较弱,mosaic包增强了它的符号运算能力,如下例对函数求导数:

> library(mosaic)

> P=makeFun(7.5*(4.1-0.5*cos(x))/(0.5*sin(x))~x)

> D(P(x)~x)

function (x)

7.5 * (0.5 * sin((x)))/(0.5 * sin((x))) - 7.5 * (4.1 - 0.5 * cos((x)))* (0.5 * cos((x)))/(0.5 * sin((x)))^2

10. 在线调试正则表达式的网站

在编写R语言程序的时候,经常需要使用正则表达式,下列网站可以用于测试正则表达式,它还可以给出匹配的图表,非常强大:

https://www.debuggex.com/r/KHugBTRjFCd4F46c

194821567.png

11. 在线编写R语言程序的网站

这是一个网页版的R语言编程环境,即使本地主机上没有安装R语言编程环境,也可以在上面进行程序开发,非常方便:

http://www.r-fiddle.org/#/fiddle?id=JnNlqmdT&version=1

194821568.png

12. bquote,quote,substitute函数的比较

quote函数表示完全引用参数中的表达式,不计算表达式的值,例如:

quote(X > 0)

#X > 0

不管X有没有定义,它都不会报错,它只是简单的返回表达式。

bquote函数是半估计函数,它只对.()内的表达式进行计算,其他部分则按照原样返回:

比如,函数要计算.()中X的值,但是发现X没有定义,则会报错:

bquote(.(X) > 0)

#Error in eval(expr, envir, enclos) :object 'X' not found

如果X已经定义,则可以正常求出.()中X的值,不会报错:

X

bquote(.(X) > 0)

#1 > 0

substitute函数是对表达式中的变量进行替换,被替换的变量会取它的值,例如把b == B + A表达式中的A用a代替,由于a

= 2,则A被替换成2,但是B没有被替换,所以按照原样输出:

a

substitute(b == B + A, list(A = a))

#b == B + 2

以上三个函数都返回call类对象,它们在实现一些高级功能中会使用到,比如动态生成表达式求值。

13. 利用switch函数编写分支程序

熟悉C,java,C#等语言的话,应该了解switch语句是用于编写分支程序的,R语言中的switch函数也是一样,比如:

switch(1,'one','two','three')

#[1] "one"

switch(2,'one','two','three')

#[1] "two"

switch(3,'one','two','three')

#[1] "three"

第一个参数表示选择第几个分支,后面的参数表示各个分支要执行的语句。

14. 词云示例

library(wordcloud)

df

tb

wordcloud(names(tb),as.numeric(tb),scale=c(8,.3),min.freq=1,max.words=100, random.order=TRUE, rot.per=.15, colors="black",vfont=c("sans serif","plain"))

194821569.png

15. 性能评测包microbenchmark

microbenchmark包可以用来比较各种函数的性能,可以在不同方法中选择最优方法:

library(stringi)

library(gsubfn)

library(microbenchmark)

set.seed(123)

myLog

myLog

Res

David =matrix(as.numeric(unlist(stri_extract_all_regex(myLog, pattern ="\\d"))), nrow = 3, byrow = TRUE),

Thela =matrix(as.numeric(unlist(strsplit(myLog,"\\[|\\]|,"))),nrow=length(myLog),byrow=TRUE)[,-1],

BD1 = matrix(as.numeric(scan(text=gsub("\\D","",myLog),what="")), nrow=length(myLog),byrow=T),

BD2 =matrix(as.numeric(scan(text=gsub("[],[]"," ",myLog),what="")),nrow=length(myLog), byrow=T),

GG1 = read.table(text =gsub("\\D", " ", myLog)),

GG2 = read.pattern(text = myLog,pat = "\\d")

)

Res

# Unit: milliseconds

# expr      min        lq      mean   median        uq       max neval

# David 12.01351  12.90111  16.41127  13.98826 15.62786 101.65117   100

# Thela 25.49944  27.09937  29.83234 28.32153  30.24141  80.79836  100

#  BD1  92.39541  94.81445 101.20524  98.07333 102.41877 172.60835   100

#  BD2  91.91578  94.66958 104.02773  96.94019 103.99383 206.37865   100

#  GG1  91.28813  94.29219 98.63825  96.57544 100.57172140.97998   100

#  GG2 470.43382 514.58552 551.94922 540.86479 570.88711 815.75789   100

194821570.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值