存儲模式與基本類型
R的變量可以存儲多種不同的數(shù)據(jù)類型茂嗓, 可以用typeof()函數(shù)來返回一個變量或表達式的類型暇韧。比如
> 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"
注意因子的結(jié)果是integer而不是因子薪铜。
R還有兩個函數(shù)mode()和storage.mode()起到與typeof()類似的作用, 這是為了提供與S語言兼容所遺留的睦裳, 應停止使用弄砍。
R中數(shù)據(jù)的最基本的類型包括logical, integer, double, character, complex, raw, 其它數(shù)據(jù)類型都是由基本類型組合或轉(zhuǎn)變得到的仙畦。 character類型就是字符串類型, raw類型是直接使用其二進制內(nèi)容的類型音婶。 為了判斷某個向量x保存的基本類型慨畸, 可以用is.xxx()類函數(shù), 如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內(nèi)容都返回真值寸士。
在R語言中數(shù)值一般看作double, 如果需要明確表明某些數(shù)值是整數(shù), 可以在數(shù)值后面附加字母L碴卧,如
> is.integer(c(1, -3))
## [1] FALSE
> is.integer(c(1L, -3L))
## [1] TRUE
整數(shù)型的缺失值是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_是整數(shù)型缺失值帅掘, NA_real是double型缺失值委煤, NA_character_是字符型缺失值。
在R的向量類型中修档, integer類型碧绞、double類型、logical類型吱窝、character類型讥邻、還有complex類型和raw類型稱為原子類型(atomic types), 原子類型的向量中元素都是同一基本類型的院峡。 比如兴使, double型向量的元素都是double或者缺失值。
除了原子類型的向量照激, 在R語言的定義中发魄, 向量還包括后面要講到的列表(list), 列表的元素不需要屬于相同的基本類型俩垃, 而且列表的元素可以不是單一基本類型元素励幼。 用typeof()函數(shù)可以返回向量的類型, 列表返回結(jié)果為"list":
> typeof(list("a", 1L, 1.5))
## [1] "list"
原子類型的各個元素除了基本類型相同口柳, 還不包含任何嵌套結(jié)構(gòu)苹粟,如:
c(1, c(2,3, c(4,5)))
## [1] 1 2 3 4 5
R有一個特殊的NULL類型, 這個類型只有唯一的一個NULL值跃闹, 表示不存在嵌削。 NULL長度為0, 不能有任何屬性值辣卒。 用is.null()函數(shù)判斷某個變量是否取NULL掷贾。
NULL值可以用來表示類型未知的零長度向量, 如c()沒有自變量時返回值就是NULL荣茫; 也經(jīng)常用作函數(shù)缺省值想帅, 在函數(shù)內(nèi)用is.null()判斷其缺省后再用一定的計算邏輯得到真正的缺省情況下的數(shù)值。
要把NULL與NA區(qū)分開來啡莉, NA是有類型的(integer港准、double旨剥、logical、character等), NA表示存在但是未知浅缸。 數(shù)據(jù)庫管理系統(tǒng)中的NULL值相當于R中的NA值轨帜。
類型轉(zhuǎn)換與類型升檔
可以用as.xxx()類的函數(shù)在不同類型之間進行強制轉(zhuǎn)換。 如
as.numeric(c(FALSE, TRUE))
## [1] 0 1
as.character(sqrt(1:4))
## [1] "1" "1.4142135623731" "1.73205080756888" "2"
類型轉(zhuǎn)換也可能是隱含的衩椒,比如蚌父, 四則運算中數(shù)值會被統(tǒng)一轉(zhuǎn)換為double類型, 邏輯運算中運算元素會被統(tǒng)一轉(zhuǎn)換為logical類型毛萌。 邏輯值轉(zhuǎn)換成數(shù)值時苟弛,TRUE轉(zhuǎn)換成1, FALSE轉(zhuǎn)換成0阁将。
在用c()函數(shù)合并若干元素時膏秫, 如果元素基本類型不同, 將統(tǒng)一轉(zhuǎn)換成最復雜的一個做盅,復雜程度從簡單到復雜依次為: logical<integer<double<character缤削。 這種做法稱為類型升檔,如
c(FALSE, 1L, 2.5, "3.6")
## [1] "FALSE" "1" "2.5" "3.6"
不同類型參與要求類型相同的運算時吹榴, 也會統(tǒng)一轉(zhuǎn)換為最復雜的類型亭敢, 也稱為類型升檔, 如:
> TRUE + 10
## [1] 11
> paste("abc", 1)
## [1] "abc 1"