• Posts tagged "3.1.1"

Blog Archives

R语言3.1版本新特性

R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大。

R语言作为统计学一门语言,一直在小众领域闪耀着光芒。直到大数据的爆发,R语言变成了一门炙手可热的数据分析的利器。随着越来越多的工程背景的人的加入,R语言的社区在迅速扩大成长。现在已不仅仅是统计领域,教育,银行,电商,互联网….都在使用R语言。

要成为有理想的极客,我们不能停留在语法上,要掌握牢固的数学,概率,统计知识,同时还要有创新精神,把R语言发挥到各个领域。让我们一起动起来吧,开始R的极客理想。

关于作者:

  • 张丹(Conan), 程序员Java,R,PHP,Javascript
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/r-version-3-1/

r-31

前言

R语言在不断的发展和进步,从R语言3.0.0版本开始,R语言开始了具有里程碑似的的发展。R内核在不断更新,越多越多的纯计算机技术指标在增加,向着企业级商用语言在靠近,R一定会大红大紫的走完2014年的,并且持续壮大和发展。

本文将介绍R的最新版本3.1.x的新特性及使用。

目录

  1. R 3.1版本
  2. R 3.1.0新特性及代码描述
  3. R 3.1.1新特性及代码描述

1. R 3.1版本

R语言3.1.0版本于2014年4月10日发布,有64项新特性发布,修复了16个bug,是一次很大规则的升级。目前的最新版本的R语言3.1.1版本发布于2014年7月10日,有17项新特性的发布,并解决了35个bug。

一般软件产品版本发布,都用3个维度来衡量 X.Y.Z,如R语言的3.1.1版本。

  • X代表最大的版本号,表示有重大的更新或者里程碑的功能点发布,大版本号新产品发布建议大家升级,使用最新的软件,比如Java5, Java6, Java7, Java8 每次升级都对Java性能及特性有重大的提升及改进。当然,大版本的升级,也可能会向前不兼容,以致于很多原来开发的应用都不能运行了,如Python 2.7.x 和 Python 3.x就是语法不兼容的,现在只能两套版本并行。
  • Y代表中版本号,主要表现在功能上,每一次Y的版本升级,都会对当前版本补充很多小功能,这些小功能一般是不太会引起大家的注意,也不会影响使用,可以想起来再升级,差1-2个Y的版本没什么关系。
  • Z代表小版本号,主要表现在解决bug上,每个X和Y版本的升级都可能会引起bug,这些bug需要及时修复,所以Z的版本会经常性的发布,有时候是1-2个月也可能3-5天。我们可以把Z的版本号,理解为给系统打补丁,只有你遇到这个bug才需要打补丁,如果没有遇到bug,对于Z的版本,我们可以不升级,等下个Y版本发布再统一升级。

R语言的快速更新,其实代表了市场迫切的声音。如果R语言能支持并发,如果R语言能支持异步,如果R语言能构建独立的应用服务器,如果R语言能并方便的处理socket、http协议,如果R语言能处理大数等…,已经有无数的功能需求被提交到了R的核心团队。我也希望R的技术小组能早日攻克这些技术难题,让R在企业级的应用中大放异彩。

从R语言版本平均每4个月一次新发布,就能看出大家都在努力着。我们可通过官方的软件镜像下载到R语言最新版本软件包http://cran.rstudio.com/,并查看版本更新的详细描述。

r3-intro

下面我就全面解释一下R语言3.1.0和3.1.1两个版本的新特性,并做代码的描述。

2. R 3.1.0新特性及代码描述

R语言3.1.0版本的别名是Spring Dance,下载R3.1.0版本后,你可以通过version来查看版本信息。


~ R              # 启动R程序
> version        # 查看版本信息               
platform       x86_64-w64-mingw32          
arch           x86_64                      
os             mingw32                     
system         x86_64, mingw32             
status                                     
major          3                           
minor          1.0                         
year           2014                        
month          04                          
day            10                          
svn rev        65387                       
language       R                           
version.string R version 3.1.0 (2014-04-10)
nickname       Spring Dance

新特性

1. type.convert()函数主要用在read.table()函数中,返回向量和因子类型,当输入为double型时会丢失精度。


> type.convert(c('abc','bcd'))   # 返回因子类型
[1] abc bcd
Levels: abc bcd

> type.convert(c(as.double(1.12121221111),'1.121'))  # double型丢失精度
[1] 1.121212 1.121000

2. 如果一个文件包含有小数位的数据,通过read.table()函数读取时,会指定为numeric类型。

新建一个文件num.csv包括小数


1,2,1.11
2.1,3,4.5

用read.table读取文件,并查看列的类型。


> num<-read.table(file="num.csv",sep=",")   # 读文件
> num
   V1 V2   V3
1 1.0  2 1.11
2 2.1  3 4.50
> class(num)
[1] "data.frame"
> class(num$V1)    # 查看列的类型为numeric
[1] "numeric"

3. tools包用Rdiff()函数的参数useDiff为FALSE时,与POSIX系统的diff -b命令类似。

新建文件num2.csv


3,2,1.11
2.1,3,4.5

用Rdiff()比较两个文件num.csv和num2.csv。


> Rdiff('num.csv','num2.csv',useDiff = FALSE)
1c1
< 1,2,1.11
---
> 3,2,1.11
[1] 1

4. 新函数anyNA(),结果与 any(is.na(.))一致,性能更好。


> is.na(c(1, NA))  
[1] FALSE  TRUE
> any(is.na(c(1, NA)))
[1] TRUE
> anyNA(c(1, NA))  
[1] TRUE

5. arrayInd()和which()函数增加useNames参数,用于列名的匹配。我在测试过程,不太理解这个参数的意义。


> which
function (x, arr.ind = FALSE, useNames = TRUE) 

6. is.unsorted()函数支持处理原始数据的向量。


> is.unsorted(1:10)   # 排序的向量
[1] FALSE

> is.unsorted(sample(1:10))  # 无序的向量
[1] TRUE

7. 用于处理table的as.data.frame()函数和as.data.frame.table()函数,支持向provideDimnames(sep,base)函数传参数。我在测试过程中,也不理解具体是什么更新。

8. uniroot()函数增加新的可选参数extendInt,允许自动扩展取值范围,并增加返回对象参数init.it。


> f1 <- function(x) (121 - x^2)/(x^2+1)   # 函数f1
> f2 <- function(x) exp(-x)*(x - 12)      # 函数f2

> try(uniroot(f1, c(0,10)))               # 在(0,10)的区间求f1函数的根
Error in uniroot(f1, c(0, 10)) : 
  f() values at end points not of opposite sign
> try(uniroot(f2, c(0, 2)))               # 在(0,2)的区间求f2函数的根
Error in uniroot(f2, c(0, 2)) : 
  f() values at end points not of opposite sign

> str(uniroot(f1, c(0,10),extendInt="yes"))  # 通过extendInt参数扩大取值搜索范围
List of 5
 $ root      : num 11
 $ f.root    : num -3.63e-06
 $ iter      : int 12
 $ init.it   : int 4
 $ estim.prec: num 6.1e-05

> str(uniroot(f2, c(0,2), extendInt="yes"))  # 通过extendInt参数扩大取值搜索范围
List of 5
 $ root      : num 12
 $ f.root    : num 4.18e-11
 $ iter      : int 23
 $ init.it   : int 9
 $ estim.prec: num 6.1e-05

9. switch(f,)函数,当参数f是因子类型时,会出警告提示,需要转换字符串参数。


> switch(ff[1], A = "I am A", B="Bb..", C=" is C")# -> "A"  # 警告提示
[1] "I am A"
Warning message:
In switch(ff[1], A = "I am A", B = "Bb..", C = " is C") :
  EXPR is a "factor", treated as integer.
 Consider using 'switch(as.character( * ), ...)' instead.

> switch(as.character(ff[1]), A = "I am A", B="Bb..", C=" is C") # 转型为字符串处理
[1] " is C"

10. 解析器已经更新,使用更少的内存。

11. 一无运算符 “+ – !” 对属性值操作时,会做一份拷贝计算,但names、dims和dimnames是例外的。


> x<-1:12;x   # 创建变量x
 [1]  1  2  3  4  5  6  7  8  9 10 11 12
> x+5         # 拷贝计算,不影响原变量x的值
 [1]  6  7  8  9 10 11 12 13 14 15 16 17
> !x
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

> dim(x) <- c(3,4);x    # 直接修改原变量x的值
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12

12. colorRamp()和colorRampPalette()支持透明色,让alpha参数为TRUE。


> cols<-colorRampPalette(c(rgb(0,0,1,1), rgb(1,0,1,0)), alpha = TRUE) # 取色的函数句柄
> filled.contour(volcano,color.palette =cols,asp = 1)  # 画图

1

13. grid.show.layout()函数 和 grid.show.viewport()函数,都增加一个可选的参数vp.ex,用于布局缩放。


> library(grid)       # 加载gird包
> grid.show.layout    # 查看函数定义
function (l, newpage = TRUE, vp.ex = 0.8, bg = "light grey", 
    cell.border = "blue", cell.fill = "light blue", cell.label = TRUE, 
    label.col = "blue", unit.col = "red", vp = NULL) 

14. 新的函数find_gs_cmd()在tools包中,用来定位GhostScript的可执行文件。

15. object.size() 函数增加format()方法定义,用于格式显示。


> letters
 [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t"
[21] "u" "v" "w" "x" "y" "z"
> object.size(letters)   # 查看letters对象大小
1496 bytes
> format(object.size(letters), units = "auto")   # 格式化显示
[1] "1.5 Kb"

16. 增加新字体ArialMT,用于pdf()和postscript()设备输出。

17. R软件的NEWS和NEWS.2文件,及新生成的文本和PDF文件,被移到doc目录存储。


> dir("C:/Program Files/R/R-3.1.0/doc")   # 查看doc目录,包括NEWS和NEWS.2文件
 [1] "AUTHORS"          "CHANGES"          "CHANGES.rds"      "COPYING"         
 [5] "COPYRIGHTS"       "CRAN_mirrors.csv" "FAQ"              "html"            
 [9] "KEYWORDS"         "KEYWORDS.db"      "manual"           "NEWS"            
[13] "NEWS.0"           "NEWS.1"           "NEWS.2"           "NEWS.pdf"        
[17] "NEWS.rds"         "README.packages"  "README.Rterm"     "RESOURCES"       
[21] "rw-FAQ"           "THANKS"         

18. combn(x)函数支持参数x为因子类型,并返回因子类型。


> combn(letters[1:4], 2)  # 字符串类型
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,] "a"  "a"  "a"  "b"  "b"  "c" 
[2,] "b"  "c"  "d"  "c"  "d"  "d" 

> combn(factor(letters[1:4]), 2)  # 因子类型
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,] a    a    a    b    b    c   
[2,] b    c    d    c    d    d   
Levels: a b c d

19. 在utils包增加fileSnapshot()函数和changedFiles()函数,用于产生目录的文件快照和比较目录的快照文件。


> snapshot<-fileSnapshot() # 产生快照
> snapshot
File snapshot:
 path = D:\workspace\R\basic\r311
 timestamp = 
 file.info = TRUE
 md5sum = FALSE
 digest = NULL
 full.names = FALSE
 args = list()
 9 files recorded.

> writeBin(3L:4L,"a.txt") # 在当目录中增加一个文件a.txt

> changedFiles(snapshot)  # 比较目录快照
Files added:
  a.txt

20. make.names()可以处理不合法的变量命名,当unique参数为TRUE时,新生成的变量名不重复。


> make.names(c("a b","a.b", "a-b"))   # 处理不正确的变量名
[1] "a.b" "a.b" "a.b"

> make.names(c("a b","a.b", "a-b"), unique = TRUE) # 会生成3个不同的变量名
[1] "a.b.1" "a.b"   "a.b.2"

21. 增加新函数cospi(x), sinpi(x) 和 tanpi(x),用于精确计算cos(pi*x),被lgamma(),besselI()等函数底层调用。


> x<-1222222222222221.323232  
> cospi(x)  # 当x变量值过大时,解决cos(pi*x)计算误差的问题
[1] -0.7071068
> cos(pi*x)
[1] -0.7175645

22. print.table(x)函数,支持x为小数。


> t1 <- round(abs(rt(10, df = 1.8)),1)
> t2 <- round(abs(rt(10, df = 1.4)),1)
> print.table(table(t1,t2),zero.print = ".")
     t2
t1    0 0.1 0.4 0.5 1 1.2 1.3 1.7 8.2
  0.1 .   .   .   . .   .   .   .   1
  0.2 .   .   1   . .   .   1   .   .
  0.4 .   .   .   . 1   .   .   .   .
  0.7 .   1   .   . .   .   .   .   .
  0.8 1   .   .   . .   .   .   .   .
  1.2 .   .   .   1 .   1   .   .   .
  1.4 .   .   1   . .   .   .   .   .
  2.2 .   .   .   . .   .   .   1   .

23. 支持更多的时间,通过OlsonNames()函数查看时区列表,用Sys.timezone()函数查看当前系统环境绑定的时区。


> head(OlsonNames())  # 时区列表
[1] "Africa/Abidjan"     "Africa/Accra"      
[3] "Africa/Addis_Ababa" "Africa/Algiers"    
[5] "Africa/Asmara"      "Africa/Asmera"   

> Sys.timezone()     # 我的系统绑定的时区
[1] "Asia/Taipei"

24. 系统支持64位的time_t类型,从而可以方便的处理超出32位的时间部分,如(1902年以前,和2038以后的时间),目前还不支持OS X系统。

25. 目前time_t类型被用于部分的类Unit的64位系统上和Window的64位系统上。

26. 增加新的环境设置,save.defaults选项包括compression_level的配置。

27. colSums()函数,支持数组和数据框在2^31个元素以上的计算。

28. 优化as.factor()函数性能,加速非integer类型的向量转换。


> a<-rnorm(1000000,-100,100000)
> head(a)
[1]    9856.935  154567.963 -200041.134   43363.338  -74436.650
[6] -178322.313
> system.time(as.factor(a))
用户 系统 流逝 
9.50 0.03 9.64 

29. 快速傅立叶变换fft()函数支持大数据量计算,从原来的1200万个增加到2亿个。


> x <- 1:100000000   # 对1亿个数字进行傅立叶变换
> system.time(fft(x))
 用户  系统  流逝 
32.96  0.22 33.32

30. svd()函数用LAPACK软件的子程序ZGESDD实现,在真实的环境下进行复杂的模拟计算。

31. 如果让Sweave输出的.tex文件为UTF-8编码,你需要在LaTex文件中增加%\SweaveUTF8的设置。

32. 文件操作file.copy()函数,增加copy.date()的参数,让复制的文件与原文件有相同的修改时间。


> file.copy("a.txt","b.txt",copy.date=TRUE)  # 创建文件b.txt
[1] TRUE
> file.copy("a.txt","c.txt",copy.date=FALSE)  # 创建文件c.txt
[1] TRUE

r311-2

a.txt 和 b.txt有相同的文件修改时间,c.txt完成是全新创建的。

33. 用缩写字母表示时区中的时间日期,在POSIXlt类中设置可选的参数zone,如巴黎1940之前,缩写为 LMT, PMT WET 或 WEST。

34. gmtoff组件可以用于记录GMT的偏移量,在支持的平台上。

35. C语言实现的strftime()函数被更新到POSIX 2008标准,用于Window, OS X等系统。

36. dnorm(x)函数计算结果更准备,当|x|>5的时候,但性能下降。


> dnorm(rnorm(10,0,100))  # 执行dnorm()函数
 [1] 1.151100e-271  0.000000e+00 2.403071e-198  0.000000e+00
 [5]  0.000000e+00 3.358647e-208  0.000000e+00  0.000000e+00
 [9]  0.000000e+00 1.136764e-154

37. tiff()函数增加压缩选项compression参数。


> tiff
function (filename = "Rplot%03d.tif", width = 480, height = 480, units = "px", pointsize = 12, compression = c("none", "rle","lzw", "jpeg", "zip", "lzw+p", "zip+p"), bg = "white", res = NA, family = "sans", restoreConsole = TRUE, type = c("windows","cairo"), antialias = c("default", "none", "cleartype", "grey", "subpixel")) 

38. read.table(), readLines() 和 scan() 函数,读取数据时增加新参数skipNul,用于跳过空值。


> readLines
function (con = stdin(), n = -1L, ok = TRUE, warn = TRUE, encoding = "unknown", skipNul = FALSE) 

39. 赋值时,避免右侧重复值的复杂计算,将减少替换值的拷贝。

40. 同时,一些其他的变化,也将减少对象的拷贝。

41. KalmanLike(), KalmanRun() 和 KalmanForecast() 函数的fast参数被mod参数替换,用于返回更新后的模型。


> fit3 <- arima(presidents, c(3, 0, 0))
> mod <- fit3$model         # 模型
> pr <- KalmanForecast(4, mod, TRUE)  # 执行卡尔曼预测函数
> mod <- attr(pr, "mod")    # 更新后的模型,保存在mod属性中

42. arima()和makeARIMA()增加新的参数SSinit,计算的状态空间的初始化的似然函数。


> arima
function (x, order = c(0L, 0L, 0L), seasonal = list(order = c(0L, 0L, 0L), period = NA), xreg = NULL, include.mean = TRUE, transform.pars = TRUE, fixed = NULL, init = NULL, method = c("CSS-ML", "ML", "CSS"), n.cond, SSinit = c("Gardner1980", "Rossignol2011"), optim.method = "BFGS", optim.control = list(), kappa = 1e+06) 

43. warning()函数增加新的参数noBreaks,用于简化输出处理。


> warning
function (..., call. = TRUE, immediate. = FALSE, noBreaks. = FALSE, domain = NULL) 

44. pushBack()函数增加新的参数encoding,支持scan(),read.table()等函数读取UTF-8编码的文件。


> pushBack   # 检查pushBack函数定义 
function (data, connection, newLine = TRUE, encoding = c("", "bytes", "UTF-8")) 

> zz <- textConnection(LETTERS)  # 建个一个文本通道
> readLines(zz, 2)
[1] "A" "B"
> pushBack(c("aa", "bb"), zz)    # 把aa,bb写入在zz对象中
> pushBackLength(zz)
[1] 2
> readLines(zz, 1)
[1] "aa"
> pushBackLength(zz)
[1] 1
> readLines(zz, 1)
[1] "bb"
> readLines(zz, 1)
[1] "C"
> close(zz)

45. all.equal.list() 函数增加新参数use.names,通过名字取代索引值来判断对象是否相等。


> a<-list(a=1,b=2)
> b<-list()
> b[['a']]<-1
> b[['b']]<-2
> all.equal.list(a,b)   # 相等
[1] TRUE

> b[['a']]<-4
> all.equal.list(a,b, use.names=TRUE)  # 不相等
[1] "Component “a”: Mean relative difference: 3"

46. all.equal() 和 attr.all.equal()增加新参数check.attributes,用于比较列名。

47. all.equal() 函数增加了检查,解决了之前未检查的空参数引入的错误。

48. 把check.attributes参数用于显示检查,允许NULL和numeric类型,会发现意想不到的错误。

49. all.equal.numeric()函数,当遇到比较的对象长度不一致时,会出现“规模差异” 的提示,但不是错误。


> all.equal.numeric(1:10,1:5)
[1] "Numeric: lengths (10, 5) differ"

50. all.equal()函数用POSIXt方法代替POSIXct方法。

51. 用seq()函数生成Date和POSIXt类型的序列时,允许使用by=quarter的分隔法。


> seq(today,today+365,by="quarter") # 按季度
[1] "2014-09-26" "2014-12-26" "2015-03-26" "2015-06-26" "2015-09-26"

> seq(today,today+365,by="2 months")   # 按2个月
[1] "2014-09-26" "2014-11-26" "2015-01-26" "2015-03-26" "2015-05-26"
[6] "2015-07-26" "2015-09-26"

52. file.path()函数用于适配路径分隔符,这个函数在我测试过程中完成没有作用。


> file.path(c("c://abc\\000\\llj/jkh","c:/abc/a","d:\\bcd")) # 没有转换路径
[1] "c://abc\\000\\llj/jkh" "c:/abc/a"             
[3] "d:\\bcd"  

53. 增加新函数agrepl(),用于模糊匹配。


> agrepl("laysy", c("1 lazy", "1", "1 LAZY"), max = 2)
[1]  TRUE FALSE FALSE

54. 让fifo()函数支持Window系统。


> capabilities("fifo")  # 检查系统是否支持
fifo 
TRUE 

55. sort.list(method="radix")函数,支持基数排序,用于数据量很大,但值域个数很少的情况,比比较类的排序快很多。


> x<-sample(1:650,1e7,replace=TRUE)
> system.time(o1<-sort.list(x))  # 普通排序
用户 系统 流逝 
7.13 0.02 7.14 
> system.time(o2<-sort.list(x,method="radix"))  # 基数排序
用户 系统 流逝 
0.08 0.00 0.07 
> all.equal(o1,o2)   # 计算结果是一致的
[1] TRUE 

56. print.ts()方法增加.preformat.ts()函数。


> sunsp.1 <- window(sunspot.month, end=c(1752, 12))
> m <- .preformat.ts(sunsp.1)
> print(m)
     Jan     Feb     Mar     Apr     May     Jun     Jul     Aug    
1749 " 58.0" " 62.6" " 70.0" " 55.7" " 85.0" " 83.5" " 94.8" " 66.3"
1750 " 73.3" " 75.9" " 89.2" " 88.3" " 90.0" "100.0" " 85.4" "103.0"
1751 " 70.0" " 43.5" " 45.3" " 56.4" " 60.7" " 50.7" " 66.3" " 59.8"
1752 " 35.0" " 50.0" " 71.0" " 59.3" " 59.7" " 39.6" " 78.4" " 29.3"
     Sep     Oct     Nov     Dec    
1749 " 75.9" " 75.5" "158.6" " 85.2"
1750 " 91.2" " 65.7" " 63.3" " 75.4"
1751 " 23.5" " 23.2" " 28.5" " 44.0"
1752 " 27.1" " 46.6" " 37.6" " 40.0"

57. mcparallel()函数增加一个参数detach,可以执行代码独立于当前的会话。它底层调用mcfork()函数设置参数estranged=TRUE,从而启动一个子进程独立于父进程运行。

58. pdf()函数输出时,将省略非常小的尺寸圆和文字,很多用户没有这样的文件。

59. hist.POSIXlt() 函数在用months,quarters和years分隔时了,右边将多加一天。

60. data.frame类型,支持索引为0,不报错。


> df<-data.frame(1:5)
> df[0,]
integer(0)
> df[1,]
[1] 1

61. hclust()函数增加ward.D2的算法实现,之前的ward算法改名为ward.D。


> m<-matrix(sample(100,100,replace=TRUE),10);m
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    8   21   93   10    4   40   61   26   55    22
 [2,]  100   85   24   98   94    1   75   70   34    85
 [3,]   12   59   12   13   28   72   76   81   94    12
 [4,]   97   34   21   50   98   26   14   37   72    62
 [5,]   27   98   14   22   16   90   57   36   60    29
 [6,]   24   87   22    6   61   68   17   13   27    93
 [7,]   94   87   64    5   89   81   27    1   18    61
 [8,]   98   89    5    5   40   26   45    4   36    53
 [9,]   34   10   32   31  100   31   64   20   25    85
[10,]   19   38   71   72   35   40   75   13   54    94

> hc1<-hclust(dist(m), method="ward.D");hc1
Call:
hclust(d = dist(m), method = "ward.D")
Cluster method   : ward.D 
Distance         : euclidean 
Number of objects: 10 

> hc2<-hclust(dist(m), method="ward.D2");hc2
Call:
hclust(d = dist(m), method = "ward.D2")
Cluster method   : ward.D2 
Distance         : euclidean 
Number of objects: 10 

> plot(hc1)
> plot(hc2)

r3-hc

62. sunspot.month数据集更新,sunspot.year数据集保持不变。


> head(sunspot.month)
[1] 58.0 62.6 70.0 55.7 85.0 83.5
> head(sunspot.year)
[1]  5 11 16 23 36 58

63. summary()函数对于lm()一元线性回归的拟合会出发警告,因为有时候计算会不准备,这与平台相关。我在Window中测试时,没有发现警告。


> ctl <- c(4.17,5.58,5.18,6.11,4.50,4.61,5.17,4.53,5.33,5.14)
> trt <- c(4.81,4.17,4.41,3.59,5.87,3.83,6.03,4.89,4.32,4.69)
> group <- gl(2, 10, 20, labels = c("Ctl","Trt"))
> weight <- c(ctl, trt)
> lm.D9 <- lm(weight ~ group)

> summary(lm.D9)

Call:
lm(formula = weight ~ group)

Residuals:
    Min      1Q  Median      3Q     Max 
-1.0710 -0.4938  0.0685  0.2462  1.3690 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   5.0320     0.2202  22.850 9.55e-15 ***
groupTrt     -0.3710     0.3114  -1.191    0.249    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.6964 on 18 degrees of freedom
Multiple R-squared:  0.07308,	Adjusted R-squared:  0.02158 
F-statistic: 1.419 on 1 and 18 DF,  p-value: 0.249

64. 在编程中,提取summary()函数计算出数据时,最好封装在suppressWarnings()函数中。


> suppressWarnings(summary(lm.D9)$cov.unscaled)
            (Intercept) groupTrt
(Intercept)         0.1     -0.1
groupTrt           -0.1      0.2

终于把这54项更新都整理完了,这些更新很多都与性能相关,另外一块是语法上的优化,看得出R语言工作的重点方向。

3. R 3.1.1新特性及代码描述

R语言3.1.1版本的别名是Sock it to Me,很有意思。下载R3.1.1版本后,你可以通过version来查看版本信息。


~ R              # 启动R程序
> version        # 查看版本信息
platform       x86_64-w64-mingw32          
arch           x86_64                      
os             mingw32                     
system         x86_64, mingw32             
status                                     
major          3                           
minor          1.1                         
year           2014                        
month          07                          
day            10                          
svn rev        66115                       
language       R                           
version.string R version 3.1.1 (2014-07-10)
nickname       Sock it to Me   

新特性

1. attach()函数的冲突提示,与library()函数信息提示是相似的,都使用message()函数来实现。


> w<-women   # 把women赋值给w
> w
   height weight
1      58    115
2      59    117
3      60    120
4      61    123
5      62    126
6      63    129
7      64    132
8      65    135
9      66    139
10     67    142
11     68    146
12     69    150
13     70    154
14     71    159
15     72    164
> attach(w)   # 加载w数据集
> height      # 直接使用数据集中的height列
 [1] 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
> attach(women)   # 加载women数据集,列名变量发生冲突
The following objects are masked from w:
    height, weight

> library(xts)     # library包加载冲突提示
载入需要的程辑包:zoo
载入程辑包:‘zoo’
The following objects are masked from ‘package:base’:
    as.Date, as.Date.numeric

2. R CMD Sweave命令,默认不再删除任何文件,并增加--clean参数设置,--clean=default和--clean=keepOuts。


~ C:\Users\Administrator>R CMD Sweave
Usage: R CMD Sweave [options] file

A front-end for Sweave and other vignette engines, via buildVignette()

Options:
  -h, --help      print this help message and exit
  -v, --version   print version info and exit
  --driver=name   use named Sweave driver
  --engine=pkg::engine  use named vignette engine
  --encoding=enc  default encoding 'enc' for file
  --clean         corresponds to --clean=default
  --clean=        remove some of the created files:
                  "default" removes those the same initial name;
                  "keepOuts" keeps e.g. *.tex even when PDF is produced
  --options=      comma-separated list of Sweave/engine options
  --pdf           convert to PDF document
  --compact=      try to compact PDF document:
                  "no" (default), "qpdf", "gs", "gs+qpdf", "both"
  --compact       same as --compact=qpdf

Report bugs at bugs.r-project.org .

3. tools包buildVignette()函数和buildVignettes()函数,当clean参数FALSE时,不再删除新创建的文件。


> library(tools)
> buildVignette
function (file, dir = ".", weave = TRUE, latex = TRUE, tangle = TRUE, 
    quiet = TRUE, clean = TRUE, keep = character(), engine = NULL, 
    buildPkg = NULL, ...) 

4. 在Bioconductor版本中使用setRepositories()函数,可以通过环境变量R_BIOC_VERSION在运行时设置,原来只能在R软件安装时设置。(Bioconductor的版本将从2.14升级到3.0)

5. 嵌入在Sweave文件的Sexpr代码的bug的错误信息,会显示源代码错误位置。

6. type.convert()函数、read.table()函数或read.*()函数,都增加了一个新的参数numerals,可以在读数据的时候直接转型成double,并设置数字精度。


> type.convert
function (x, na.strings = "NA", as.is = FALSE, dec = ".", numerals = c("allow.loss", "warn.loss", "no.loss")) 
.External2(C_typeconvert, x, na.strings, as.is, dec, match.arg(numerals))
<bytecode: 0x0000000008e1b948>
<environment: namespace:utils>

7. 增加R语言内部代码的健壮性,修正一些编译器,对于整理加法溢出无异常提示的问题。


> as.integer(2000000000)+as.integer(2000000000)
[1] NA
Warning message:
In as.integer(2e+09) + as.integer(2e+09) : NAs produced by integer overflow

8. smooth.spline()函数的knots参数默认值改为.nknots.smspl。


> smooth.spline
function (x, y = NULL, w = NULL, df, spar = NULL, cv = FALSE, 
    all.knots = FALSE, nknots = .nknots.smspl, keep.data = TRUE, 
    df.offset = 0, penalty = 1, control.spar = list(), tol = 1e-06 * IQR(x)) 

9. Beta分布函数dbeta(, a,b), pbeta(), qbeta() 和 rbeta() 的a,b参数默认值改为0,原来是NaN。a,b对应参数为shape1, shape2。


> dbeta
function (x, shape1, shape2, ncp = 0, log = FALSE) 
{
    if (missing(ncp)) 
        .External(C_dbeta, x, shape1, shape2, log)
    else .External(C_dnbeta, x, shape1, shape2, ncp, log)
}
<bytecode: 0x000000000d54c070>
<environment: namespace:stats>

10. RStudio的图形设备不能正常使用dev.new()函数,给dev.new()函数增加的新的参数noRStudioGD,替换原来的默认选择,从而实现在RStudio中图形设备的开发。


> dev.new()  # 警告错误
NULL
Warning message:
In (function ()  : Only one RStudio graphics device is permitted

> dev.new(noRStudioGD=TRUE)   # 弹出新窗口,运行正确

11. 增加readRDS()函数,用于读了rds的数据文件。


> d<-data.frame(a=1:10,b=10:1)
> saveRDS(d, "d.rds")      # 把d数据框,以rds格式保存
> d2<-readRDS("d.rds")  # 读取rds数据
> d2
    a  b
1   1 10
2   2  9
3   3  8
4   4  7
5   5  6
6   6  5
7   7  4
8   8  3
9   9  2
10 10  1

12. 当修改内部逻辑标量常数的时候,会提示错误,原来是警告。


> pi    # 常数pi
[1] 3.141593
> pi<<-3.2    #  修改常数pi会出错
Error: cannot change value of locked binding for 'pi'

13. install.packages(repos = NULL)函数,支持http或ftp协议的下载并安装新包。


> install.packages("plyr", repos = "http://cran.rstudio.com/")
trying URL 'http://cran.rstudio.com/bin/windows/contrib/3.1/plyr_1.8.1.zip'
Content type 'application/zip' length 1151983 bytes (1.1 Mb)
opened URL
downloaded 1.1 Mb

package ‘plyr’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
	C:\Users\Administrator\AppData\Local\Temp\RtmpWEXnOT\downloaded_packages

14. 当R环境变量options("warnPartialMatchDollar")为TRUE,数据框用$符号部分匹配为会出现警告。


> options("warnPartialMatchDollar")   # 默认值
$warnPartialMatchDollar
NULL
> options(warnPartialMatchDollar = TRUE)    # 赋值设为TRUE
> options("warnPartialMatchDollar")
$warnPartialMatchDollar
[1] TRUE

> df <- data.frame(ab=1:4,cd=1:4)
> rownames(df) <- paste0(letters[1:4],"a")
> df$a      # 警告
[1] 1 2 3 4
Warning message:
In `$.data.frame`(df, a) : Partial match of 'a' to 'ab' in data frame
> df["a",]  # 另一种调用方法

15. 通过package?foo的语法来查询包的信息,无论包是否被加载。


> search()    # 当前环境已加载的包,不包括plyr
 [1] ".GlobalEnv"        "tools:rstudio"     "package:stats"    
 [4] "package:graphics"  "package:grDevices" "package:utils"    
 [7] "package:datasets"  "package:methods"   "Autoloads"        
[10] "package:base"

> package?plyr # 可以直接打开plyr的包帮助

> package?pryr
Error in `?`(package, pryr) : 
  没有种类为‘package’和題目为‘pryr’的文件(或是在处理帮助文件时发生了错误)

16. 调用R的帮助,现在默认会尝试所有加载的包,而不仅仅是在搜索路径。


> help(package="zoo")   # 查看未加载包的信息
> ??zoo                 # 查看未加载包中,所有名字匹配的函数

17. 增加promptImport()函数,用于从其他包导出一个帮助文件。


> promptImport(cat)   # 导出cat函数的帮助文件
建立一名字叫‘cat.Rd’的文件。
修改文件再把它放到合适的目录中去。

查看生成cat.Rd文件。


\name{cat}
\alias{cat}
\docType{import}
\title{Import from package \pkg{base}}
\description{
The \code{cat} object is imported from package \pkg{base}.
Help is available here:  \code{\link[base:cat]{base::cat}}.
}

对于R 3.1.1版本的更新,一部分增加新功能,另外有些更新其实是在给3.1.0版本修补bug。

对于想深入学习R语言的用户来说,每次更新升级都需要看一遍这个列表,很多是时候都可以解决我们实际遇到的问题。比如,R3.1.1版本第10个更新对RStudio图形输出的支持,就可以直接解决在我在RStudio中由于图形设备错误,不能开发游戏的问题。

补充说明,由于每个更新点官司仅有一句话描述,而我的知识水平有限,也并不是所有都能理解,文章中难免理解错误的地方,如果有同学发现还请指教。

转载请注明出处:
http://blog.fens.me/r-version-3-1/

打赏作者