R语言让我很困惑。实体有模式和类,但即使这样也不足以完全描述实体。
这个答案说
在 R 中,每个“对象”都有一个模式和一个类。
所以我做了这些实验:
> class(3) [1] "numeric" > mode(3) [1] "numeric" > typeof(3) [1] "double"
到目前为止还算公平,但后来我传入了一个向量:
> mode(c(1,2)) [1] "numeric" > class(c(1,2)) [1] "numeric" > typeof(c(1,2)) [1] "double"
那没有意义。当然,整数向量应该与单个整数具有不同的类或不同的模式?我的问题是:
更新:显然,文字 3 只是长度为 1 的向量。没有标量。好的但是......我试过mode("string")了"character",让我认为一个字符串是一个字符向量。但如果这是真的,那么这应该是真的,但事实并非如此!c('h','i') == "hi"
mode("string")
"character"
c('h','i') == "hi"
我同意 R 中的类型系统相当奇怪。之所以这样,是因为它已经进化了(很长)时间......
请注意,您错过了一个类似类型的函数storage.mode和一个类似类的函数oldClass。
storage.mode
oldClass
所以,modeandstorage.mode是旧式类型(哪里storage.mode更准确),并且typeof是更新,更准确的版本。
mode
typeof
mode(3L) # numeric storage.mode(3L) # integer storage.mode(`identical`) # function storage.mode(`if`) # function typeof(`identical`) # closure typeof(`if`) # special
然后class是一个完全不同的故事。class主要是class一个对象的属性(这正是oldClass返回的)。但是当class属性没有设置时,该class函数由对象类型和dim属性组成一个类。
class
oldClass(3L) # NULL class(3L) # integer class(structure(3L, dim=1)) # array class(structure(3L, dim=c(1,1))) # matrix class(list()) # list class(structure(list(1), dim=1)) # array class(structure(list(1), dim=c(1,1))) # matrix class(structure(list(1), dim=1, class='foo')) # foo
最后,类可以返回多个字符串,但前提是类属性是这样的。然后第一个字符串值是主类的种类,以下是它继承的内容。组成的类的长度始终为 1。
# Here "A" inherits from "B", which inherits from "C" class(structure(1, class=LETTERS[1:3])) # "A" "B" "C" # an ordered factor: class(ordered(3:1)) # "ordered" "factor"