R语言中的class()、mode()和typeof()的区别

今天对R语言中的这三个函数产生了疑惑,为什么有时候它们的运行结果一样,有时候却又不一样?

定义

mode
 The (Storage) Mode of an Object
Description
 Get or set the type or storage mode of an object.

typeof
 The Type of an Object
Description
 typeof determines the (R internal) type or storage mode of any object

class
 Object Classes
Description
 R possesses a simple generic function mechanism which can be used for an object-oriented style of programming.
 Method dispatch takes place based on the class of the first argument to the generic function.

解释

在R里面,每一个对象都有一个mode和一个class。
前者表示对象在内存中是如何存储的。 (numeric, character, list and function)
后者表示对象的抽象类型。

1
2
3
4
5
6
7
d <- data.frame(V1=c(1,2))
class(d)
# [1] "data.frame"
mode(d)
# [1] "list"
typeof(d)
# list

通过上面的例子,我们可以知道,data frame这种类型,在内存中作为list被存储,但是它们被包装成data frame。
对于某个函数的参数,它的类型是data frame,却不能说是list。

再来看mode和typeof。
mode和typeof通常返回同样的值,但也有例外。

typeof(c(1,2))
# [1] "double"
mode(c(1,2))
# [1] "numeric"

历史原因啦。R语言由S语言发展而来。
mode,为了和S语言兼容,返回R的对象的模式。
typeof是R语言特有的,返回一个R的对象的类型。(哎呀,解释不清楚啦)

参考

1.http://stackoverflow.com/questions/6258004/r-types-and-classes-of-variables
2.http://stats.stackexchange.com/questions/3212/mode-class-and-type-of-r-objects