5

使用该class函数可以确定对象的类:

> x = 5
> class(x)
[1] "numeric"

我也明白我们可以使用is.object命令来确定一个对象是否有一个类。然而,有些对象类型是隐式的,即

> is.object(x)
[1] FALSE

声明 R 中的所有变量都是对象并且is.object仅对非隐式类进行测试是否正确?

此外,类型如何适应这一点。天真地,我认为以下代码会产生错误:

> x = 5
> class(x) = "fake"
> x = X + 1
> x + 1
[1] 6
attr(,"class")
[1] "fake"

x仍然有“双”类型,仍然一切正常。类型可以被认为是所有其他对象都继承自的超类吗?

4

2 回答 2

3

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"
于 2011-01-18T22:46:08.413 回答
2

第一个问题的部分答案可在 R 语言定义的第 2 章中找到

R 不提供对计算机内存的直接访问,而是提供了许多专门的数据结构,我们将其称为对象。这些对象通过符号或变量来引用。然而,在 R 中,符号本身就是对象,可以像任何其他对象一样进行操作。

所以,是的,所有变量都是对象。

is.object似乎或多或少等同于function(x) !is.null(attr(x, "class"))但我愿意被证明是错误的。

至于第二个问题,我认为会发生这种情况:由于x具有“假”类,R+.fake在添加中查找方法,但当找不到时,它会使用默认方法。该默认方法基于底层 C 代码,该代码使用typeof(x)(或 C 等效项)来确定应该做什么。在这种情况下,类型x是“整数”。

于 2011-01-18T14:56:20.757 回答