#11. 字符串操作
a<-c("Equator","North Pole","South Pole")
grep("Pole",a)#在字符串a中搜索Pole
nchar(a)#返回字符串a的长度(R语言中的字符串末尾没有空字符NULL)
#对于非字符形式就要用到Hadley Wickham写的stringr包
paste("North","Pole",sep="")
b<-sprintf("the square of %d is %d",8,8^2)#按一定格式把若干个组件组合成字符串
substr(b,5,10)#返回给定字符串中指定位置范围5:10上的子字符串
strsplit(b," ")#根据b中的字符串,把字符串b拆分成若干个子字符串
regexpr("uat","Equator")#在字符串Equator中寻找uat,返回与uat匹配的全部子字符串的起始位置
#正则表达式:用来描述一系列字符串的简略表达式
grep("[au]",a)#表示a中含有字母a或u的字符串
grep("o.e",a)#表示a中含有以o开头,后跟任意一个字符,并以e结尾的字符串
grep("N..t",a)#表示a中含有以N开头,后跟任意两个字符,并以t结尾的字符串
#元字符:不按照字面意思理解的字符
grep(".",a)#得到的不是想要的结果,因为.是元字符
grep("\\.",a)#反斜杠\使它脱离句点的元字符属性,用两个\的原因是\自身也必须脱离元字符属性
#14. 速度与内存
#使R代码速度更快的办法:
#1.通过向量化的方式、使用字节码编译
#2.把最消耗CPU的部分用编译型语言编写,如使用C
#3.将代码用某种并行的方式进行编写
#可怕的for循环:
#1.用向量化提升速度:
#有可能加速代码的向量化函数包括:ifelse(),which(),where(),any(),all(),cumsum(),cumprod()
#对于矩阵,rowSums(),colSums()
#对于“穷举所有组合”,combn(),outer(),lower.tri(),upper.tri(),expand.grid()
#apply()可消除显示循环,但实际上使用R而不是CC实现的,通常不能加速代码
#但其他的apply函数,如lapply()对于加速代码很有帮助
#system.time(代码)#代码运行时间
#outer(X,Y,FUN)#将FUN函数应用于X和Y中的元素所有可能配对之上
#函数式编程和内存问题
#向量赋值问题:
a<-c(1,4,6,8,3,7)
a[3]<-9#先创建a的副本,再将副本中的第3个元素更改为9,最后再将得到的向量赋值给a
#表面上看只修改了向量的一个元素,但含义是“整个向量都被重新计算了”
#改变时拷贝:R经常会采取改变时拷贝的机制,同样也会存在例外
b<-runif(10);
tracemem(b)#返回b的内存地址
b[3]<-9;tracemem(b)
#利用Rprof()来寻找代码的瓶颈
x<-runif(10)
Rprof()
fz<-function(x) x[3]<-3
invisible(fz(x))#不让输出结果被展示出来
Rprof(NULL)
summaryRprof()
#字节码编译:
library(compiler)
x<-runif(100000);y<-runif(100000);z<-c()
fz<-function(x,y) {for(i in 1:length(x)) z[i]<-x[i]+y[i]}
cf<-cmpfun(fz)
system.time(cf(x,y))
#内存无法装下数据的处理办法:数据分块或利用R软件包来进行内存管理
RMySQL包:R到SQL数据库的一个接口
biglm包;可以在非常大的数据集上进行回归和广义线性模型的分析
bigmemory包:不仅可以将数据存储在硬盘上,还可以将数据保存在机器的主内存上
a<-c("Equator","North Pole","South Pole")
grep("Pole",a)#在字符串a中搜索Pole
nchar(a)#返回字符串a的长度(R语言中的字符串末尾没有空字符NULL)
#对于非字符形式就要用到Hadley Wickham写的stringr包
paste("North","Pole",sep="")
b<-sprintf("the square of %d is %d",8,8^2)#按一定格式把若干个组件组合成字符串
substr(b,5,10)#返回给定字符串中指定位置范围5:10上的子字符串
strsplit(b," ")#根据b中的字符串,把字符串b拆分成若干个子字符串
regexpr("uat","Equator")#在字符串Equator中寻找uat,返回与uat匹配的全部子字符串的起始位置
#正则表达式:用来描述一系列字符串的简略表达式
grep("[au]",a)#表示a中含有字母a或u的字符串
grep("o.e",a)#表示a中含有以o开头,后跟任意一个字符,并以e结尾的字符串
grep("N..t",a)#表示a中含有以N开头,后跟任意两个字符,并以t结尾的字符串
#元字符:不按照字面意思理解的字符
grep(".",a)#得到的不是想要的结果,因为.是元字符
grep("\\.",a)#反斜杠\使它脱离句点的元字符属性,用两个\的原因是\自身也必须脱离元字符属性
#14. 速度与内存
#使R代码速度更快的办法:
#1.通过向量化的方式、使用字节码编译
#2.把最消耗CPU的部分用编译型语言编写,如使用C
#3.将代码用某种并行的方式进行编写
#可怕的for循环:
#1.用向量化提升速度:
#有可能加速代码的向量化函数包括:ifelse(),which(),where(),any(),all(),cumsum(),cumprod()
#对于矩阵,rowSums(),colSums()
#对于“穷举所有组合”,combn(),outer(),lower.tri(),upper.tri(),expand.grid()
#apply()可消除显示循环,但实际上使用R而不是CC实现的,通常不能加速代码
#但其他的apply函数,如lapply()对于加速代码很有帮助
#system.time(代码)#代码运行时间
#outer(X,Y,FUN)#将FUN函数应用于X和Y中的元素所有可能配对之上
#函数式编程和内存问题
#向量赋值问题:
a<-c(1,4,6,8,3,7)
a[3]<-9#先创建a的副本,再将副本中的第3个元素更改为9,最后再将得到的向量赋值给a
#表面上看只修改了向量的一个元素,但含义是“整个向量都被重新计算了”
#改变时拷贝:R经常会采取改变时拷贝的机制,同样也会存在例外
b<-runif(10);
tracemem(b)#返回b的内存地址
b[3]<-9;tracemem(b)
#利用Rprof()来寻找代码的瓶颈
x<-runif(10)
Rprof()
fz<-function(x) x[3]<-3
invisible(fz(x))#不让输出结果被展示出来
Rprof(NULL)
summaryRprof()
#字节码编译:
library(compiler)
x<-runif(100000);y<-runif(100000);z<-c()
fz<-function(x,y) {for(i in 1:length(x)) z[i]<-x[i]+y[i]}
cf<-cmpfun(fz)
system.time(cf(x,y))
#内存无法装下数据的处理办法:数据分块或利用R软件包来进行内存管理
RMySQL包:R到SQL数据库的一个接口
biglm包;可以在非常大的数据集上进行回归和广义线性模型的分析
bigmemory包:不仅可以将数据存储在硬盘上,还可以将数据保存在机器的主内存上
#15. R与其他语言的接口
#调用C:
#获得Borland的自由编译器的网址为ttp://www.borland.com/bcppbuilder/freecompiler/
#dyn.load("filename.dll")#导入由C编译得到的DLL库,即加载编译好的C程序
#.C(函数名,as.double(参数1),as.double(参数2),....)#返回的包含所有调用参数的列表
#若修改了C程序,则先用dyn.unload("filename.dll")卸载,再重新导入
#另外还可以用.Call调用,具体可参照R随机手册Write R Extensions第5章
#还可以从Python调用R,最常用的接口是RPy,可从http://rpy.sourceforge.net下载源代码并自己编译模块