显示R对象的内部结构

时间:2013-05-03 20:05:51

标签: r serialization data-structures

有没有办法以明确和人类可读的方式显示R对象的完整内部结构?

str函数并不完全这样做,因为它显示了自定义表示。例如,将它应用于igraph对象会产生类似

的内容
IGRAPH U--- 3 3 -- Full graph
+ attr: name (g/c), loops (g/x)
+ edges:
[1] 1--2 1--3 2--3

这很好看且可读,但它特定于igraph对象(很明显它使用自定义格式)。我正在寻找一般的东西。我找到了dput,有一段时间我认为这提供了完整的信息。相同的igraph对象显示为

structure(list(3, FALSE, c(1, 2, 2), c(0, 0, 1), c(0, 1, 2), 
    c(0, 1, 2), c(0, 0, 1, 3), c(0, 2, 3, 3), list(c(1, 0, 1), 
        structure(list(name = "Full graph", loops = FALSE), .Names = c("name", 
        "loops")), list(), list())), class = "igraph")

但后来我读到了R语言定义中的pairlists,我注意到dput(pairlist(1,2))给出了list(1,2)。我们从一个骑行者开始的信息消失了。

那么有类似dput的东西显示R对象的内部结构并提供完整的信息吗? (我想要的主要原因是它可以帮助我更好地理解R对象的结构。)

如果没有,我将如何查询R对象以获取有关它的足够信息(以人类可读的方式 - 不是机器可读的)以便能够完全重建它?

2 个答案:

答案 0 :(得分:8)

除了我的评论之外,我没有太多要补充的内容,所以这只是为了后代的完整性:)

dput 做你想做的事。除了极少数例外,其中一个是pairlist(我假设可能还有其他例外,但我实际上并不知道它们是什么),它不会是完全相同的对象,但是,至少在pairlist的情况是有原因的。由于pairlist不应该在内部代码之外使用,因此dput的输出可以被视为通过将内部对象转换为等效项来帮助用户外在的。

答案 1 :(得分:2)

dput是一个有点令人失望的解决方案,因为结果非常混乱。 (但是,它比我以前做的更好。)

我建议(1)dput,(2)制作副本,(3)将基类分配给结果(如dput中所示)和(4){{ 1}}它。

在这种情况下:

str