小编典典

R中事物类型的全面调查;'mode' 和 'class' 和 'typeof' 不够用

all

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"

那没有意义。当然,整数向量应该与单个整数具有不同的类或不同的模式?我的问题是:

  • R 中的所有东西都有(正好一个)吗?
  • R 中的所有内容都具有(恰好一个)模式吗?
  • ‘typeof’ 告诉我们什么,如果有的话?
  • 完整描述一个实体还需要哪些其他信息?(例如,“向量”存储在哪里?)

更新:显然,文字 3 只是长度为 1 的向量。没有标量。好的但是......我试过mode("string")"character",让我认为一个字符串是一个字符向量。但如果这是真的,那么这应该是真的,但事实并非如此!c('h','i') == "hi"


阅读 64

收藏
2022-06-28

共1个答案

小编典典

我同意 R 中的类型系统相当奇怪。之所以这样,是因为它已经进化了(很长)时间......

请注意,您错过了一个类似类型的函数storage.mode和一个类似类的函数oldClass

所以,modeandstorage.mode是旧式类型(哪里storage.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属性组成一个类。

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"
2022-06-28