第3章 数据结构

了解一门语言,当然要从它的数据结构开始,否则你无法操纵程序中的对象。这对单身忍者尤其重要:有时候胡子拉碴忙活了大半夜,突然程序告诉你连对象都找不到,你悲催的心情,一定凉过杜甫的茅屋为秋风所破歌。

对象很重要

3.1 向量

忍者判断数值相对大小从来不用大于小于或等号,也从来不目测,因为在浮点数运算中,大小比较从来不靠谱。以下这事儿让COS的R版主都震惊了(http://cos.name/cn/topic/106794):

x=seq(0,1,by=0.2)
y=seq(0,1,by=0.2)
y[4]
## [1] 0.6
x[3]
## [1] 0.4
1-x[3]
## [1] 0.6
y[4]>1-x[3]
## [1] TRUE

竟然出现了0.6大于0.6的情况,版主大人大呼坑爹。当时我的回帖是:

作为R版版主,应该做到在凌晨四点突然被人叫醒问你10乘以0.1等于几,你在1秒钟之内斩钉截铁回答,不是1!(R FAQ 7.31)。

简单来说就是浮点数在计算机中的表达有限制,不能以任意精度存储,所以尤其是微小的数字或巨大的数字在运算时经常会有些意外情况。再举几个例子:

seq(0,1,.1)
##  [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
seq(0,1,.1)==c(0,.1,.2,.3,.4,.5,.6,.7,.8,.9,1)
##  [1]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE
.3-.7+.4==0
## [1] FALSE
sqrt(2)^2==2
## [1] FALSE

3.2 矩阵

3.3 数据框

3.4 列表