希望以下内容能有所帮助:
首先:棘手的部分是在 R 中使用了 3 个不同的 OO(面向对象)系统,以及第 4 个系统,称为基本类型,它是其他 OO 系统的基础:后者提供(C- ) 代码作为其他 OO 系统的构建块。根据系统,定义类和方法的方式会有所不同。 S3系统应该可以满足大部分R编程的需求,所以我会尝试基于这个系统进行讲解(关于其他系统的信息,请访问下面的信息来源:H. Wickham, Advanced R;R tutorial by Kelly Black; R 用于数据科学,导入、整理、转换、可视化和建模数据,作者:H. Wickham 和 G. Grolemund,O'Reilly,2017)。
在我回答您的问题之前简要介绍一下背景:1) 基本类型 & 2) 属性:
1)
每个 R 对象的基础是一个 C 结构(或所谓的 struct),它定义了该对象如何存储在内存中。 struct 包括:
a) 内存管理所需的信息;
B) 对象的内容,
C) 最重要的是,类型。这是 R 对象的基本类型。基本类型并不是真正的对象系统,因为只有 R 核心团队才能创建新类型。因此,很少添加新的基本类型。
最常见的基本类型是向量(原子向量和列表)。
但环境和功能等也是基础对象的类型。
Vector Types: Hierarchy
2)
任何向量都可以通过其属性包含任意附加元数据。您可以将属性视为可以附加到任何对象的向量的命名列表(在 R 会话中创建的许多对象都有与之关联的属性)。您可以使用 (attr() 获取和设置单个属性值,或者使用 attributes() 一次查看它们。有 3 个非常重要的属性用于实现 R 的基本部分:
A) 名称 —> 用于命名向量的元素
B) 维度 —> 使向量表现得像矩阵或数组
C) 类 —> 用于实现 S3 OO 系统。一般来说,它定义了对象的“行为”。它通过描述其属性及其与其他类的关系来做到这一点。泛型函数(在 S3 OO 系统中执行计算的特殊类型的函数(现有的 3 个 R OO 系统的 1/3 在类和方法的定义上有所不同))是 R 中 OO 编程的关键,因为它们使对于不同类型的输入,函数的行为不同。选择方法时也会使用一个类,这些方法的行为取决于其输入的类(另见下文)。 S3 没有正式的类定义。要使一个对象成为一个类的实例,您需要一个现有的基础对象并使用 class 命令设置类属性。
您的 Q 已回答,基于 S3:
方法:
在 S3 中方法属于泛型函数,基于第一个参数的类(所有方法都是函数,但并非所有函数都是方法)/。 S3 方法不属于类或对象。 UseMethod() 将调用特定方法。您可以使用 methods() 列出泛型的所有方法。
Mode() 和 storage.mode() 是 typeof() 返回的名称的别名的函数。这些函数仅出于 S 兼容性目的而存在。您也可以忽略它们,或者如果您想了解它们的确切作用:阅读/解密它们的源代码。
Typeof() 将为您提供对象的基本类型(因此,如上所述,向量、环境、函数等)。所以,当你问“x 的类型是什么”时,vector,正如你所建议的那样,正确。您应该不说数字或整数,但如果您的向量是 6 种类型之一:逻辑,整数 、double*、character、complex 或 raw*,您可以将其称为 “原子向量”,如果它是整数或double,您可以专门将其称为 “数字类型的原子向量”。注意:不幸的是,基本类型的名称在整个 R 中并未一致使用,类型和相应的“is”函数可能使用不同的名称,请参见下面的代码(来源:R tutorial by Kelly Black)
# The type of a function is "closure"
f <- function() {}
typeof(f)
#> [1] "closure"
is.function(f)
#> [1] TRUE
# The type of a primitive function is "builtin"
typeof(sum)
#> [1] "builtin"
is.primitive(sum)
#> [1] TRUE