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环境变量中,在我的机器上设置如下:


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

args<-commandArgs(TRUE)

header<-eval(parse(text=args[1]))

 

data<-data.frame(one=1:10,two=1:10,three=1:10)

colnames(data)<-header

head(data)

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


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

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

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

 

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

 

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

R consoleRStudio中没有这个问题)中执行需要打印结果的程序时,打印结果往往不能逐渐显示出来,而是要等到程序执行完了才一次性显示出来,这对于观察程序运行过程和调试代码都很不方便,而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 <- Vectorize(rep.int)

> 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包则可以把数值范围扩展到无限大,比如计算e10000次方:

library(Rmpfr)

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

a <- mpfr(exp(1), precBits=64)

#计算e10000次方

a^10000

#1 'mpfr' number of precision  64  bits

#[1] 8.80681822565823791192e4342

 

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

# example from ?hclust

hc <- hclust(dist(USArrests),"ave")

 

# 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)

 

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))


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

 

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


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

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

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


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 <- 1

bquote(.(X) > 0)

#1 > 0

 

substitute函数是对表达式中的变量进行替换,被替换的变量会取它的值,例如把b == B + A表达式中的Aa代替,由于a = 2,A被替换成2但是B没有被替换,所以按照原样输出:

a <- 2

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

#b == B + 2

 

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

 

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

熟悉CjavaC#等语言的话,应该了解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<-data.frame(theNames=c("John","John", "Joseph A", "Mary A", "Mary A","Paul H C", "Paul H C"))

tb<-table(df$theNames)

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"))


15. 性能评测包microbenchmark

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

 

library(stringi)

library(gsubfn)

library(microbenchmark)

 

set.seed(123)

myLog <-c("[1,2,3]","[4,5,6]","[7,8,9]")

myLog <- sample(myLog, 1e4, replace =TRUE)

 

Res <- microbenchmark(

               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


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值