R对象识别

133

我经常遇到一个函数产生的输出数据类型让我摸不着头脑。我期望得到的是一个列表,但最终它变成了一个嵌套列表、数据框或其他什么东西。在首次使用一个函数时,有什么好的方法或工作流程能够确定其输出数据类型呢?

4个回答

139

我通常会从一些组合开始:

typeof(obj)
class(obj)
sapply(obj, class)
sapply(obj, attributes)
attributes(obj)
names(obj)

根据所揭示的情况适当地进行处理。例如,尝试使用:
obj <- data.frame(a=1:26, b=letters)
obj <- list(a=1:26, b=letters, c=list(d=1:26, e=letters))
data(cars)
obj <- lm(dist ~ speed, data=cars)

如若obj为S3或S4对象,可以尝试使用methodsshowMethodsshowClass等方式。Patrick Burns的R地狱有一个非常好的章节关于此问题(第7节)。 编辑:Dirk和Hadley在他们的回答中提到str(obj), 它确实比上述任何一种方式都更适合快速甚至详细地查看对象。

1
我不认为我在《R地狱》中读到那么远。谢谢你让我回去看看。 - JD Long
3
如果你还没有看过,“15页或更少中的S4对象”[http://www.stat.auckland.ac.nz/S-Workshop/Gentleman/S4Objects.pdf]是另一篇很好的文章(有更多细节)。 - ars
我还没有看到那个。感谢提供链接。那真的很值得一看。 :) - JD Long
我创建了一个小型实用函数来编码这个建议。请参见tellMeAboutThis.r - eludom

69
str(x)

在99%的情况下,这就是你需要记住的全部。


2
如果x是一个多层ggplot,那么str(x, max.level=1)可能会很有用! - PatrickT
8
str(UCTURE) 很难记住,因为我总是会想到 "string",但它非常有用。我只能说 strUCTURE 十次来记住它。 - Dmitri
如果我有str(x)返回Named num [1:10] 1.555 8.424 .... -attr(*,"names")= chr [1:10] "x1" "x2" ...,这是什么意思?这是一个带名称的原子向量吗? - James
更普遍地说,我如何知道一个对象是矩阵、数据帧等类型?str()似乎没有暴露这个信息。 - James

13

如果我通过某种方式获取了 'someObject',比如:

someObject <- myMagicFunction(...)

那么我通常会继续进行以下步骤:

class(someObject)
str(someObject)

根据您所拥有的类别,可以使用head()、summary()、print()等后续函数。


刚刚尝试了str(obj)。字符串表示比我预期的要多得多,非常整洁!谢谢。 - ars

9
attributes(someObject) 

也可以很有用


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