3.1 内在属性:模式和长度
R 操作的实体在技术上来说就是对象(object)。实数或复数向量,逻辑向量和字符串向量之类的对象属于“原子”(atomic)型的对象,因为它们的元素都是一样的类型或模式1。 R 的对象类型包括数值型(numeric)2,复数型(complex),逻辑型 (logical),字符型(character)和原味型(raw)。
向量必须保证它的所有元素是一样的模式。因此任何给定的向量必须明确属于逻辑性,数值型,复数型,字符型或者原味型。(这里有个特定的例外就是“值”为 NA
的元素。实际上 NA
有好几种形式的)。注意空向量也有自己的模式。例如,空的字符串向量将会被显示 character(0)
和空的数值向量显示为 numeric(0)
。
R 同样操作被称为列表的对象。这种对象在 R 里面是一种列表(list
)模式。列表可以为任何模式的对象的有序序列。列表被认为是一种“递归”结构而不是原子结构因为它们的元素可以以它们各自的方式单独列出。
另外两种递归结构是函数(function)和表达式(expression)。构成 R 系统的函数对象以及其他类似的用户定义的函数对象都将在后面的内容中深入讨论。表达 式对象是 R 的高级部分,不是本文档的重点,我们只是在讨论 R 统计建模中的公式(formulae)时间接地提一下。
一个对象的模式(mode)是该对象基本要素的类型。这是专门用来描述一个对象“特征”(property)的术语。另外一个所有对象都有的特征是长度(length)。函数 mode(object)
和 length(object)
可用于任何数据对象以得到其模式和长度3。
一个对象更详细的特征常常通过 attributes(object)
得到,具体参见返回和设定对象属性。正因为这样,模式和长度又叫做一个对象的“内在属性”。
例如,如果 z 是一个长为100的复数向量,那么命令 mode(z)
就会得到字符 串 "complex" 而 length(z)
对应的是100。
R 可以在任何需要的时候对模式进行转换(当然,有些时候没有必要)。例如
> z <- 0:9
我们可以进行如下转换
> digits <- as.character(z)
这样,digits
就是一个字符向量 c("0", "1", "2", ..., "9")
。我们可以再一次强制转换,或者说模式改变,以重建数值向量:
> d <- as.integer(digits)
现在 d
和 z
就一样了4。有一系列类似 as.something()
的函数,这些函数主要用于对象模式数据的强制转换,或者赋予某个对象一些先前没有的功能。读者可以参考不同 的帮助文档以熟悉它们。
1. 译者注:实际上 R 已经有自己独立的函数 typeof()
,仍然保留模式的概念主要是为了和 S 兼容。 ↩
2. 数值型模式实际上是两种独立模式的混合模式,即整数型(integer)和双精度型(double)。具体 可以参考手册。 ↩
3. 注意 length(object)
有时会返回一些没有意义的信息,如在 object 是一个对象的时候。 ↩
4. 许多时候,从数值到字符的强制转换,然后再转回不总是可逆的。因为在数字的字符表示时有近似 转换(roundoff)的问题。 ↩