7

有没有办法以明确且人类可读的方式显示 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 语言定义中的配对列表,我注意到 dput(pairlist(1,2))给出了list(1,2). 我们从配对列表开始的信息消失了。

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

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

4

2 回答 2

9

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

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

于 2013-05-03T21:07:27.773 回答
2

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

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

在这种情况下:

> x<-dput(my_graph)
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")
> class(x)<-"list"
> str(x)
List of 9
 $ : num 3
 $ : logi FALSE
 $ : num [1:3] 1 2 2
 $ : num [1:3] 0 0 1
 $ : num [1:3] 0 1 2
 $ : num [1:3] 0 1 2
 $ : num [1:4] 0 0 1 3
 $ : num [1:4] 0 2 3 3
 $ :List of 4
  ..$ : num [1:3] 1 0 1
  ..$ :List of 2
  .. ..$ name : chr "Full graph"
  .. ..$ loops: logi FALSE
  ..$ : list()
  ..$ : list()
于 2013-05-04T02:37:14.780 回答