【问题标题】:What's the difference between the types of objects in R?R中的对象类型有什么区别?
【发布时间】:2021-04-02 05:52:20
【问题描述】:

我似乎对 R 中的对象类型有很多定义。 有 mode()、typeof() 和 class()。这似乎是对象的类型。所以已经有了对象类型的三种定义。还有vector、array、matrix、dataframe、list,也被定义为“对象的类型”(至少在一些网站上,像这个https://www.programcreek.com/2014/01/vector-array-list-and-data-frame-in-r/)。

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

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

【问题讨论】:

    标签: r object types


    【解决方案1】:

    希望以下内容能有所帮助:

    首先:棘手的部分是在 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
    
    

    【讨论】:

      猜你喜欢
      • 2021-06-04
      • 1970-01-01
      • 2014-02-19
      • 2011-11-15
      • 2016-02-16
      • 2013-03-20
      • 2014-03-22
      • 2010-10-01
      • 1970-01-01
      相关资源
      最近更新 更多