2013-05-03 79 views
5

有沒有辦法以明確的和人類可讀的方式顯示R對象的內部結構的完整顯示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)。我們從一個pairlist開始的信息已經消失了。

那麼有沒有類似於dput的東西,它顯示了R對象的內部結構,並給出了完整有關它的信息? (我希望這樣做的主要原因是它能幫助我更好地理解R對象的結構。)

如果沒有,我將如何查詢R對象以獲取關於它的足夠信息(在人類可讀方式---不是機器可讀)能夠完全重建它?

+2

怎麼樣'。內部(檢查(富))'? – 2013-05-03 20:16:22

+6

我認爲'dput' * *是你想要的,而'pairlist'異常就是這樣 - 一個例外。據我瞭解,你不應該使用'pairlist',所以'輸入'這個問題有點沒有實際意義。 – eddi 2013-05-03 20:18:05

+0

感謝回覆@eddi,爲什麼不把它作爲答案? – Szabolcs 2013-05-03 20:31:11

回答

8

我沒有太多的更多,除了我的評論補充,所以這只是爲了完整性後代:)

dput做你想要什麼。除了極少數的例外情況,其中一個是pairlist(我認爲也可能有其他例外,但我實際上並不知道它們是什麼),它不會是完全相同的對象,但至少在pairlist這是有原因的。由於pairlist不應該在內部代碼之外使用,所以dput的輸出可以被認爲是通過將內部對象轉換爲外部對象的等效來幫助用戶。

+1

還有更多例外。環境被簡稱爲「」,即使它們具有屬性。閉包失去'srcref'屬性,封閉環境和字節碼(如果存在)。 – 2013-05-04 01:33:00

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() 
+0

我之前沒有使用'dput',所以我不知道這個方法有多普遍。這與@eddi提供的解決方案基本相同,但是採用了一些新的步驟。我從他的回答和上面的評論中學到了很多。我在這裏寫的內容太長,不能評論他的答案,這已經足夠好了。不過,我希望有人能得到更令人滿意的答案。 (我主演了這個問題)'.Internal(inspect())'(@Joshua Ulrich提到的)可能是下一個最好的東西,但是我還沒有足夠的程序員來讀取輸出。 – Frank 2013-05-04 02:37:26