R对象的模式,类和类型


39

我想知道R对象的Mode,Class和Type之间有什么区别?R对象的类型可以通过typeof()函数获得,模式可以通过mode()获得,类可以通过class()获得。

还有其他我错过的类似功能和概念吗?

谢谢并恭祝安康!


2
str(变量)是你最好的朋友。
布兰登·贝特尔森

2
另请参阅“ R:变量的类型和类”,以及有关堆栈溢出的问题。
Leo

Answers:


21

所述class()用于定义/确定哪些“类型”的对象是从图面向对象编程的在R.所以点

> x <- 1:3
> class(x)
[1] "integer"

具有“整数”方法的任何泛型函数都将被使用。

typeof()从R的角度mode()给出了物体的“类型” ,而从Becker,Chambers&Wilks(1988)的角度给出了物体的“类型”。根据R语言定义手册,后者可能与其他S实现更兼容。

typeof()在大多数情况下,我可能会犯错,除非它是用于将R对象传递给已编译的代码,storage.mode()否则将很有用。

在上面的R语言定义中对此进行了有用的讨论。


3
为什么有这么多观点?除了混乱,我看不到任何好处。
smwikipedia

1
@smwikipedia,因为R的遗产包括S-Plus和S,并且后者的语言随着时间而发展。另外,还需要区分用户可以创建的对象和基础对象类型。
恢复莫妮卡-G.辛普森

@smwikipedia,因为R就是这样。出于同样的原因,我们也有<-=进行变量分配。
安德烈·特拉

9

来自:https : //www.mail-archive.com/r-help@r-project.org/msg17169.html

“模式”是根据对象的基本结构对对象进行互斥的分类。“原子”模式是数字,复杂,字符和逻辑模式。递归对象具有“列表”或“功能”或其他一些模式。一个对象只有一种模式。

“类”是分配给对象的属性,该属性确定泛型函数如何对其进行操作。这不是相互排斥的分类。如果没有为对象分配特定的类,例如简单的数字矢量,则按照惯例,该类通常与其模式相同。

改变物体的模式通常被称为“强制”。对象的模式可以更改,而不必更改类。


1

class和typeof之间的主要区别在于,第一个可以由用户定义,但类型不能。例如,定义一个列表

> x<-list("a",c(1,2))

> # x is a list
> class(x)
[1] "list"
> # class can be user defined
> class(x)<-"newclass"
> class(x)
[1] "newclass"

> typeof(x)
[1] "list"
# you cannot assign a different type using typeof()
> typeof(x)<-"newclass"
Error in typeof(x) <- "newclass" : could not find function "typeof<-" 

为用户定义的对象赋予特定的类名对于编写程序非常有用。它允许以类似于面向对象编程语言中发生的方式标记用户定义的对象。


根据该R文档typeofclass,关于“主要的区别”的说法是不正确。 class是对象的属性,可以分配该对象的属性而与它的内部存储模式无关,而“ typeof确定任何对象的(R内部)类型或存储模式”。一个描述逻辑特征,而另一个描述对象的物理特征。
ub
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.