存储模式与基本类型
R的变量可以存储多种不同的数据类型, 可以用typeof()函数来返回一个变量或表达式的类型。比如
> typeof(1:3)
## [1] "integer"
> typeof(c(1,2,3))
## [1] "double"
> typeof(c(1, 2.1, 3))
## [1] "double"
> typeof(c(TRUE, NA, FALSE))
## [1] "logical"
> typeof('Abc')
## [1] "character"
> typeof(factor(c('F', 'M', 'M', 'F')))
## [1] "integer"
注意因子的结果是integer而不是因子。
R还有两个函数mode()和storage.mode()起到与typeof()类似的作用, 这是为了提供与S语言兼容所遗留的, 应停止使用。
R中数据的最基本的类型包括logical, integer, double, character, complex, raw, 其它数据类型都是由基本类型组合或转变得到的。 character类型就是字符串类型, raw类型是直接使用其二进制内容的类型。 为了判断某个向量x保存的基本类型, 可以用is.xxx()类函数, 如is.integer(x), is.double(x), is.numeric(x), is.logical(x), is.character(x), is.complex(x), is.raw(x)。 其中is.numeric(x)对integer和double内容都返回真值。
在R语言中数值一般看作double, 如果需要明确表明某些数值是整数, 可以在数值后面附加字母L,如
> is.integer(c(1, -3))
## [1] FALSE
> is.integer(c(1L, -3L))
## [1] TRUE
整数型的缺失值是NA, 而double型的特殊值除了NA外, 还包括Inf, -Inf和NaN, 其中NaN也算是缺失值, Inf和-Inf不算是缺失值。 如:
c(-1, 0, 1)/0
## [1] -Inf NaN Inf
is.na(c(-1, 0, 1)/0)
## [1] FALSE TRUE FALSE
对double类型,可以用is.finite()判断是否有限值, NA、Inf, -Inf和NaN都不是有限值; 用is.infinite()判断是否Inf或-Inf; is.na()判断是否NA或NaN; is.nan()判断是否NaN。
严格说来, NA表示逻辑型缺失值, 但是当作其它类型缺失值时一般能自动识别。 NA_integer_是整数型缺失值, NA_real是double型缺失值, NA_character_是字符型缺失值。
在R的向量类型中, integer类型、double类型、logical类型、character类型、还有complex类型和raw类型称为原子类型(atomic types), 原子类型的向量中元素都是同一基本类型的。 比如, double型向量的元素都是double或者缺失值。
除了原子类型的向量, 在R语言的定义中, 向量还包括后面要讲到的列表(list), 列表的元素不需要属于相同的基本类型, 而且列表的元素可以不是单一基本类型元素。 用typeof()函数可以返回向量的类型, 列表返回结果为"list":
> typeof(list("a", 1L, 1.5))
## [1] "list"
原子类型的各个元素除了基本类型相同, 还不包含任何嵌套结构,如:
c(1, c(2,3, c(4,5)))
## [1] 1 2 3 4 5
R有一个特殊的NULL类型, 这个类型只有唯一的一个NULL值, 表示不存在。 NULL长度为0, 不能有任何属性值。 用is.null()函数判断某个变量是否取NULL。
NULL值可以用来表示类型未知的零长度向量, 如c()没有自变量时返回值就是NULL; 也经常用作函数缺省值, 在函数内用is.null()判断其缺省后再用一定的计算逻辑得到真正的缺省情况下的数值。
要把NULL与NA区分开来, NA是有类型的(integer、double、logical、character等), NA表示存在但是未知。 数据库管理系统中的NULL值相当于R中的NA值。
类型转换与类型升档
可以用as.xxx()类的函数在不同类型之间进行强制转换。 如
as.numeric(c(FALSE, TRUE))
## [1] 0 1
as.character(sqrt(1:4))
## [1] "1" "1.4142135623731" "1.73205080756888" "2"
类型转换也可能是隐含的,比如, 四则运算中数值会被统一转换为double类型, 逻辑运算中运算元素会被统一转换为logical类型。 逻辑值转换成数值时,TRUE转换成1, FALSE转换成0。
在用c()函数合并若干元素时, 如果元素基本类型不同, 将统一转换成最复杂的一个,复杂程度从简单到复杂依次为: logical
c(FALSE, 1L, 2.5, "3.6")
## [1] "FALSE" "1" "2.5" "3.6"
不同类型参与要求类型相同的运算时, 也会统一转换为最复杂的类型, 也称为类型升档, 如:
> TRUE + 10
## [1] 11
> paste("abc", 1)
## [1] "abc 1"