R语言包的数量已经有近万个,及时关注新发布的包,以及已发布的包的更新状态,非常重要,下列网站提供了这个功能,读者可以经常访问:
http://lib.stat.cmu.edu/R/CRAN/web/packages/available_packages_by_date.html
以Windows系统为例,按照以下步骤:
1. 把Rscript.exe的路径加入到Path环境变量中,在我的机器上设置如下:
2. 创建名为script.R的R语言脚本文件,放在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脚本,无法运行需要与用户交互的脚本,比如有用户界面的脚本,只能一次性把所有参数都传递进去。
在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()
}
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"
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
默认状态下,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 <- mpfr(exp(1), precBits=64)
#计算e的10000次方
a^10000
#1 ‘mpfr‘ number of precision 64 bits
#[1] 8.80681822565823791192e4342
# 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)
使用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))
原因是一个坐标被使用了两次,起点和终点使用了相同的坐标,所以首尾点相连了。
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
在编写R语言程序的时候,经常需要使用正则表达式,下列网站可以用于测试正则表达式,它还可以给出匹配的图表,非常强大:
https://www.debuggex.com/r/KHugBTRjFCd4F46c
这是一个网页版的R语言编程环境,即使本地主机上没有安装R语言编程环境,也可以在上面进行程序开发,非常方便:
http://www.r-fiddle.org/#/fiddle?id=JnNlqmdT&version=1
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表达式中的A用a代替,由于a = 2,则A被替换成2,但是B没有被替换,所以按照原样输出:
a <- 2
substitute(b == B + A, list(A = a))
#b == B + 2
以上三个函数都返回call类对象,它们在实现一些高级功能中会使用到,比如动态生成表达式求值。
熟悉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"
第一个参数表示选择第几个分支,后面的参数表示各个分支要执行的语句。
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"))
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
原文地址:http://blog.csdn.net/liu7788414/article/details/45422223