使用类函数更改S4对象的“类”时会发生什么情况?

瑞·维埃拉

如果我有S4课,例如:

setClass("MyClass",
     representation(
       data="data.frame",
       name="character"))

并将其实例化(例如obj),

obj <- new('MyClass', data=data.frame(1:3), name='An S4 class')

我将具有以下表示形式:

An object of class "MyClass"
Slot "data":
  X1.3
1    1
2    2
3    3

Slot "name":
[1] "An S4 class"

到现在为止还挺好。

但是,如果我尝试使用以下方法来更改“类”:

class(obj) <- "animal"

我现在得到

An object of class "animal"
<S4 Type Object>
attr(,"data")
  X1.3
1    1
2    2
3    3
attr(,"name")
[1] "An S4 class"

如果我尝试检查它是否仍然是S4类,它将返回true:

>isS4(obj)
[1] TRUE

到底是怎么回事?为什么“插槽”更改为属性?这真的仍然是S4班吗?

更新:

感谢您的全面解答。只是为了澄清一下,我并不希望这能在任何实际情况下起作用或使用。我只是想更好地了解这种行为背后的机制。另外,很难选择一个“最佳”答案(它们都是非常好的),但是按照SO的精神,我必须选择一个。

马丁·摩根

S4将插槽实现为属性。这通常对用户隐藏,但很容易看到

> attributes(setClass("MyClass", representation(x="integer"))())
$x
integer(0)

$class
[1] "MyClass"
attr(,"package")
[1] ".GlobalEnv"

更详细一点,我们有

> .Internal(inspect(setClass("MyClass", representation(x="integer"))()))
@1fe4dfd8 25 S4SXP g0c0 [OBJ,NAM(2),S4,gp=0x10,ATT] 
ATTRIB:
  @1fe4dfa0 02 LISTSXP g0c0 [] 
    TAG: @23c8978 01 SYMSXP g0c0 [MARK,NAM(2)] "x"
    @1fe4df68 13 INTSXP g0c0 [] (len=0, tl=0)
    TAG: @2363208 01 SYMSXP g0c0 [MARK,NAM(2),LCK,gp=0x4000] "class" (has value)
    @1fd9f1b8 16 STRSXP g0c1 [NAM(2),ATT] (len=1, tl=0)
      @2e09e138 09 CHARSXP g0c1 [gp=0x61] [ASCII] [cached] "MyClass"
    ATTRIB:
      @1fd9fb20 02 LISTSXP g0c0 [] 
    TAG: @236cc00 01 SYMSXP g0c0 [MARK,NAM(2)] "package"
    @1fd9f278 16 STRSXP g0c1 [NAM(2)] (len=1, tl=0)
      @23cc938 09 CHARSXP g0c2 [MARK,gp=0x61] [ASCII] [cached] ".GlobalEnv"

这表明用于表示所有R对象的基础S表达式是S4SXP,带有附加的属性列表。

class<-正如@hadley所指出的那样,通过使用S3-ism,您创建了一个混合怪物。class<-仅更新class属性,而不更改基础S4SXP。当您打印对象时,它使用打印方法打印“动物”类对象的打印,可能是print.default。另一方面,isS4测试S表达式是否为S4SXP。所以你们每个人都有...

强制,也许通过将releventsetAs函数实现, using为(obj,“ animal”)`。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将属性应用于python中的类方法时会发生什么情况?

来自分类Dev

实例化python类但未定义__init __()方法时会发生什么情况?

来自分类Dev

将函数用作参数时会发生什么情况?

来自分类Dev

使用“ + =”在Java中“更改”字符串时会发生什么情况?

来自分类Dev

当您使用“ + =”在Java中“更改”字符串时会发生什么情况?

来自分类Dev

如果从类文件中删除超级构造函数调用,会发生什么情况?

来自分类Dev

如果仅在类中重写hashCode()并在Set中使用它,会发生什么情况?

来自分类Dev

OOP:在已经从对象创建对象之后更改类时会发生什么?

来自分类Dev

构造函数使用1个参数,但基本关键字使用2个参数时会发生什么情况

来自分类Dev

构造函数使用1个参数,但基本关键字使用2个参数时会发生什么情况

来自分类Dev

从派生类调用基函数时会发生什么?

来自分类Dev

在执行预取任务之前更改celery任务代码时会发生什么情况?

来自分类Dev

当我在依赖jar的项目中进行更改时会发生什么情况?

来自分类Dev

将可移动对象插入std :: set失败时会发生什么情况?

来自分类Dev

将具有导航属性的对象添加到Db时会发生什么情况?

来自分类Dev

在Haskell中用+编写*时会发生什么情况?

来自分类Dev

在Git中删除分支时会发生什么情况

来自分类Dev

如果我不在扩展类中调用可选的超级方法或构造函数,会发生什么情况?

来自分类Dev

将1Byte数据转换为4Byte时会发生什么情况

来自分类Dev

使用Java中的main方法为类创建对象时会发生什么

来自分类Dev

不等待HttpClient使用时会发生什么情况

来自分类Dev

在Java函数中创建并存储在对象中的对象会发生什么情况?

来自分类Dev

当原始类超出范围时,线程会发生什么情况

来自分类Dev

iOS:当我从其他类调用重写的方法时,会发生什么情况

来自分类Dev

如果通过lambda函数对象返回对局部变量的引用,会发生什么情况?

来自分类Dev

由于配置更改,重新创建活动的静态成员时会发生什么情况

来自分类Dev

虚拟析构函数,如果在派生类中没有析构函数,会发生什么情况?

来自分类Dev

当我以`even`作为生成器函数调用`even(3)`时会发生什么情况?

来自分类Dev

如果ACL OpenErp中的同一对象有多个访问权限,会发生什么情况?

Related 相关文章

  1. 1

    将属性应用于python中的类方法时会发生什么情况?

  2. 2

    实例化python类但未定义__init __()方法时会发生什么情况?

  3. 3

    将函数用作参数时会发生什么情况?

  4. 4

    使用“ + =”在Java中“更改”字符串时会发生什么情况?

  5. 5

    当您使用“ + =”在Java中“更改”字符串时会发生什么情况?

  6. 6

    如果从类文件中删除超级构造函数调用,会发生什么情况?

  7. 7

    如果仅在类中重写hashCode()并在Set中使用它,会发生什么情况?

  8. 8

    OOP:在已经从对象创建对象之后更改类时会发生什么?

  9. 9

    构造函数使用1个参数,但基本关键字使用2个参数时会发生什么情况

  10. 10

    构造函数使用1个参数,但基本关键字使用2个参数时会发生什么情况

  11. 11

    从派生类调用基函数时会发生什么?

  12. 12

    在执行预取任务之前更改celery任务代码时会发生什么情况?

  13. 13

    当我在依赖jar的项目中进行更改时会发生什么情况?

  14. 14

    将可移动对象插入std :: set失败时会发生什么情况?

  15. 15

    将具有导航属性的对象添加到Db时会发生什么情况?

  16. 16

    在Haskell中用+编写*时会发生什么情况?

  17. 17

    在Git中删除分支时会发生什么情况

  18. 18

    如果我不在扩展类中调用可选的超级方法或构造函数,会发生什么情况?

  19. 19

    将1Byte数据转换为4Byte时会发生什么情况

  20. 20

    使用Java中的main方法为类创建对象时会发生什么

  21. 21

    不等待HttpClient使用时会发生什么情况

  22. 22

    在Java函数中创建并存储在对象中的对象会发生什么情况?

  23. 23

    当原始类超出范围时,线程会发生什么情况

  24. 24

    iOS:当我从其他类调用重写的方法时,会发生什么情况

  25. 25

    如果通过lambda函数对象返回对局部变量的引用,会发生什么情况?

  26. 26

    由于配置更改,重新创建活动的静态成员时会发生什么情况

  27. 27

    虚拟析构函数,如果在派生类中没有析构函数,会发生什么情况?

  28. 28

    当我以`even`作为生成器函数调用`even(3)`时会发生什么情况?

  29. 29

    如果ACL OpenErp中的同一对象有多个访问权限,会发生什么情况?

热门标签

归档