1.3.2 矩阵
矩阵是二维数组,与向量对象一样,每个元素的数据类型必须相同。套件{datasets}中有一个矩阵对象state.x77,它是美国50州的统计数据(如人口、收入、治安、气候与面积等)。
state.x77是matrix类型的对象,在查询维度名称时请注意,names()只能用来查询向量、列表(1.3.4节)与数据集(1.3.5节)等广义的一维对象中元素或变量名称,此处用于matrix上则返回空值。因此,查询矩阵行名及列名时须用dimnames(),而非names()。通过dimnames()返回结果的两个成对中括号内的列表元素编号,读者可发现:50×8矩阵的50个行名与8个列名字符串向量因长度的不同,所以组织成1.3.4节将提到的列表对象。
R语言面向对象的类别概念比较紊乱,有多个函数可返回对象的类型,前述class()函数是从面向对象泛型函数(参见1.6节编程范式与面向对象概念)的视角,返回对象的类型,也就是说任何可以处理matrix类型对象的泛型函数,都可以施加在state.x77上。此外,typeof()函数从R语言内部的视角返回对象类型;而mode()则从S语言的视角返回对象类型或模态(mode),与其他S语言的工具兼容性更高;storage.mode()则与R对象传到编译代码中的任务有关 。
· 矩阵创建的函数是matrix(),语法如下:
mymatrix<-matrix(向量对象,nrow=行数,ncol=列数,byrow=逻辑值,dimnames=list(行名字符串向量,列名字符串向量))
下例中先使用字符粘贴函数paste0()产生行名与列名字符串向量,请注意R语言以及Python语言的numpy模块因为向量化运算的特征,都会将长度较短的向量(此例中为"row"与"col")自动放大为等长的向量,再按照对应元素进行粘贴操作。关于这种特性,R语言称为循环(recycle),而Python则命名为广播(broadcasting)。最后,matrix()创建函数中,因为各维因子水平数不一定相同,用1.3.4节将介绍的列表创建函数list(),组织其各维名称向量dimnames。