R 中的对象类型有什么区别?

问题描述

我似乎有很多关于 R 中对象类型的定义。 有 mode()、typeof() 和 class()。这似乎是对象的类型。所以已经有三个对象类型的定义。还有向量、数组、矩阵、数据框、列表,它们也被定义为“对象的类型”(至少在某些网站中,例如https://www.programcreek.com/2014/01/vector-array-list-and-data-frame-in-r/)。

所以,我的问题是:R 中对象的类型是什么?是模式吗?是班级吗?它是typeof()的输出吗?是列表/矩阵/数据帧/数组之间的东西吗?

我有点困惑。如果有人问我 x 的类型是什么?我应该回答“整数”之类的问题,还是应该说“数字”,还是应该说“向量”?

解决方法

希望以下内容对您有所帮助:

首先:棘手的部分是在 R 中使用了 3 个不同的 OO(面向对象)系统,以及第 4 个系统,称为基础类型,它是其他 OO 系统的基础:后者提供 (C- ) 代码作为其他面向对象系统的构建块。根据系统的不同,例如定义类和方法的方式会有所不同。 S3系统应该可以满足大部分R编程的需求,所以我会尝试基于这个系统来解释(其他系统的信息,请访问下面的信息来源:H. Wickham,Advanced R; R tutorial by Kelly BlackR for Data Science,导入、整理、转换、可视化和建模数据 作者:H. Wickham 和 G. Grolemund,O'Reilly,2017 年)。

在我回答您的问题之前简要介绍一下背景:1) 基本类型 & 2) 属性

1)

每个 R 对象的基础是一个 C 结构(或所谓的结构),它定义了该对象如何存储在内存中结构 包括: 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 命令设置类属性。

您的问题的回答,基于 S3:

方法: 在 S3 中方法属于泛型函数,基于第一个参数的类(所有方法都是函数,但并非所有函数都是方法)/。 S3 方法不属于类或对象。 UseMethod() 将调用特定的方法。您可以使用 methods() 列出泛型的所有方法。 Mode() 和 storage.mode() 是函数,它们只是 typeof() 返回的名称的别名。这些函数仅出于 S 兼容性目的而存在。您也可以忽略它们,或者如果您想了解它们究竟做了什么:阅读/解密它们的源代码。

Typeof() 会给你一个对象的基本类型(所以,如上所述,一个向量、一个环境、一个函数等)。因此,当您问“x 的类型是什么”时,vector,正如您所建议的那样正确。您应该说数字或整数,但是如果您的向量是其中之一:逻辑,整数,double*,character,complex,or 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
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...