typeof
返回内部 C 表示的类型,不用于方法分派。所以严格来说,您不能将类型视为“超类”。
相反,有基本类(数字、字符、列表、函数等)大致对应于返回的名称typeof
,但并非总是如此(例如 double 类型属于数字类,特殊和闭包属于函数类,以及 data.frame 类是列表类型!)。
使用 S3 和 S4 系统,您可以使用基本类构建非平凡的类(但不必扩展其中之一!!例如:setClass("foo", list(a="numeric",b="character")
不扩展任何基本类)。
对于来自这些基本类的对象,is.object
返回FALSE
. 正如其文档所述,此函数提供了一种非常快速的方法来检查对象是否属于用户构建的 S3 或 S4 类(即不是基本类之一)。
转换x
为“假”后,您的对象正式不是“数字”类:
is(x, "numeric")
#FALSE
但它可以解释为基本的“数字”对象:
is.numeric(x)
#TRUE
这就是为什么+
在这里工作。因此,在内部,正如@Richie 已经说过的,默认方法解释x
为数字基本类。
这种概念上的混乱是因为 S3 对类的非正式处理。请改用 S4。
typeof(.) 和基本类(.) 的对应关系:
typeof(.) class(.)
NULL "NULL" "NULL"
1 "double" "numeric"
1:1 "integer" "integer"
1i "complex" "complex"
list(1) "list" "list"
data.frame(x=1) "list" "data.frame"
pairlist(pi) "pairlist" "pairlist"
c "special" "function"
lm "closure" "function"
formals(lm)[[1]] "symbol" "name"
formals(lm)[[2]] "symbol" "name"
y~x "language" "formula"
expression((1))[[1]] "language" "("
(y~x)[[1]] "symbol" "name"
expression(x <- pi)[[1]][[1]] "symbol" "name"