gpt4 book ai didi

oop - is.object 和 S3 类系统

转载 作者:行者123 更新时间:2023-12-01 01:31:21 26 4
gpt4 key购买 nike

使用 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仍然有“double”类型,仍然一切正常。可以将类型视为所有其他对象都继承自的父类(super class)吗?

最佳答案

typeof返回内部 C 表示的类型,它不用于方法调度。所以严格来说,你不能将类型视为“父类(super class)”。

取而代之的是基础类 (数字、字符、列表、函数等)大致对应于名称
返回者 typeof ,但并非总是如此(例如,double 属于 numeric 类,special 和closure 属于类
函数,类 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"

关于oop - is.object 和 S3 类系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4725272/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com