is.object(1:10)
#> [1] FALSE
is.object(mtcars)
#> [1] TRUE
sloop::otype(1:10)
#> [1] "base"
sloop::otype(mtcars)
#> [1] "S3"
attr(1:10, "class")
#> NULL
attr(mtcars, "class")
#> [1] "data.frame"12 Base types
Introduction
在R中,流传着这么一句话——R里的一切都是对象。但此“对象”与面向对象(OOP)中的“对象”不同,前者指得是来自于S语言的base object,它比面向对象出现得更早。它们的关系可以表示为:

下面我们介绍如何区分base object和OO object及所有base object的类别。
Base VS OO objects
区分二者的三种方法:
is.object():base object返回FALSE,OO object返回TRUE。sloop::otype():base object返回base,OO object返回其他,如S3。attr():base object返回NULL,OO object返回class属性。
从技术上讲,base object 与 OO object 的本质区别就是OO object具有class属性。但是仅限于attr()函数,class()`函数会返回结果。
x <- 1:10
class(x)
#> [1] "integer"
sloop::s3_class(x)
#> [1] "integer" "numeric"Base types
无论是OO object还是base object,都有一个base type,使用typeof()来查看;不要使用mode()或storage.mode(),它们只适配S语言。
typeof(1:10)
#> [1] "integer"
typeof(mtcars)
#> [1] "list"
typeof(mean)
#> [1] "closure"R 的底层使用了C语言中的switch语句来对不同base type执行不同处理。想要新增一个base type需要修改R-core,所以通常不会随意增加base type。截至目前一共有25种base type,下面按照本书中出现的顺序列举。
Vector
| base Type | C Type |
|---|---|
NULL |
NILSXP |
logical |
LGLSXP |
integer |
INTSXP |
double |
REALSXP |
complex |
CPLXSXP |
character |
STRSXP |
list |
VECSXP |
raw |
RAWSXP |
typeof(NULL)
#> [1] "NULL"
typeof(1L)
#> [1] "integer"
typeof(1i)
#> [1] "complex"Functions
| base Type | C Type | function type |
|---|---|---|
closure |
CLOSXP |
regular R functions |
special |
SPECIALSXP |
internal functions |
builtin |
BUILTINSXP |
primitive functions |
typeof(mean)
#> [1] "closure"
typeof(`[`)
#> [1] "special"
typeof(sum)
#> [1] "builtin"Environments
| base Type | C Type |
|---|---|
| environment | ENVSXP |
typeof(globalenv())
#> [1] "environment"S4
| base Type | C Type |
|---|---|
S4 |
S4SXP |
mle_obj <- stats4::mle(function(x = 1) (x - 2)^2)
typeof(mle_obj)
#> [1] "S4"Language components
| base Type | C Type |
|---|---|
symbol |
SYMSXP |
language |
LANGSXP |
pairlist |
LISTSXP |
expression |
EXPRSXP |
typeof(quote(a))
#> [1] "symbol"
typeof(quote(a + 1))
#> [1] "language"
typeof(formals(mean))
#> [1] "pairlist"
typeof(expression(1 + 0:9))
#> [1] "expression"Others
| base Type | C Type |
|---|---|
externalptr |
EXTPTRSXP |
weakref |
WEAKREFSXP |
bytecode |
BCODESXP |
promise |
PROMSXP |
... |
DOTSXP |
any |
ANYSXP |
Numeric type
“numeric”在R中存在三种解读:
某些地方,
numeric是double的别名。例如as.numeric()和as.double()等价,numeric()和double()等价。在S3和S4系统中,“numeric”用作”integer type”或”double type”的缩写:
sloop::s3_class(1)
#> [1] "double" "numeric"
sloop::s3_class(1L)
#> [1] "integer" "numeric"is.numeric()用来检测那些行为类似number的对象。例如,因子(factor)的本质是”integer type”,但是没有number的行为(求取一个因子的均值毫无意义)。
typeof(factor("x"))
#> [1] "integer"
is.numeric(factor("x"))
#> [1] FALSE本书中的numeric表示integer或double。
