为什么summary(a$alpha)返回"class -none-"而class(a$alpha)返回"numeric"?

3

我定义了列表 a 并询问第一个元素 alpha 的类:

a <- list(alpha=c(1,2,3), beta=c("cat","dog","duck"), gamma=factor("a","b","a"))
class(a$alpha)

[1] "数字"

接下来,我要求对a进行摘要,报告alpha的类别为-none-

summary(a)
      Length Class  Mode     
alpha 3      -none- numeric  
beta  3      -none- character
gamma 1      factor numeric  

问题:(1) 为什么会这样?(2) 我对R和编程都是新手。除了R语言定义之外,你能推荐给初学者的参考资料吗?我发现很难理解mode、class和type之间的区别。提前感谢。

1个回答

1
我不敢说完全理解这里的为什么,但就我所知,这就是正在发生的事情。
实际上,summary.default 调用的是 oldClass 而不是 class。为什么我不确定,尽管我确定有很好的理由。
?class中存在以下几段话:
许多 R 对象都具有一个类属性,即给出对象继承的类名称的字符向量。如果对象没有类属性,则具有隐式类 "matrix"、"array" 或 mode(x) 的结果(除了整数向量具有隐式类 "integer")。(函数 oldClass 和 oldClass<- 可以获取和设置此属性,也可以直接完成。)
所以这里发生的事情是,class 返回隐式类 (numeric)。请注意, attr(a $alpha,"class") 返回 NULL。由于属性不存在,oldClass 忠实地返回 NULL
关于mode、type和class之间的区别,前两者相关,第三者则是一种独立的概念。我认为文档已经相当详细地解释了mode和type。`mode`告诉你一个对象的存储模式,但它依赖于`typeof`的结果,所以它们(大多数情况下)是相同的,或者至少是相互关联的。但是,`typeof`返回的不同值只是被折叠到更小的子集中。

我想我明白了:由于a$alpha没有class属性,因此将返回一个由mode(a$alpha)给出的隐式属性numeric。但是,a$alpha是一个整数向量,并且根据您加粗的文本,应该具有隐式类integer。我错过了什么? - user7661
@user7661 不要根据控制台输出的内容做出假设。重新创建你的对象a,但是这次使用向量c(1L,2L,3L),再试一遍。 - joran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接