2013-05-03 44 views
5

Có cách nào để hiển thị cấu trúc bên trong hoàn thành của đối tượng R theo cách rõ ràng và dễ đọc không?Hiển thị cấu trúc bên trong của đối tượng R

Chức năng str không chính xác thực hiện điều này vì nó thể hiện các đại diện tùy chỉnh. Ví dụ, áp dụng nó cho một đối tượng igraph cho một cái gì đó giống như

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

này là tốt đẹp và dễ đọc, nhưng nó đặc trưng cho igraph đối tượng (rõ ràng là nó sử dụng một định dạng tùy chỉnh cho họ). Tôi đang tìm một cái gì đó chung chung. Tôi tìm thấy dput và trong một thời gian, tôi nghĩ rằng điều này cung cấp thông tin đầy đủ. Các đối tượng igraph cùng được hiển thị như

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") 

Nhưng sau đó tôi đọc về pairlists trong Definition R Ngôn ngữ và tôi nhận thấy rằng dput(pairlist(1,2)) cho list(1,2). Thông tin mà chúng tôi đã bắt đầu với một danh sách ghép hình đã biến mất.

Vì vậy, có điều gì đó tương tự như dput hiển thị cấu trúc bên trong của đối tượng R và cung cấp thông tin hoàn thành về thông tin này? (Lý do chính tôi muốn điều này là nó sẽ giúp tôi hiểu cấu trúc của các đối tượng R tốt hơn.)

Nếu không có, làm thế nào tôi sẽ truy vấn đối tượng R để có đủ thông tin về nó (trong một người có thể đọc được) cách --- không thể đọc được máy) để có thể tái tạo lại nó hoàn toàn?

+2

Làm thế nào về '.internal (kiểm tra (foo)) '? –

+6

Tôi nghĩ rằng 'dput' * là * những gì bạn muốn và ngoại lệ' pairlist' chỉ là - một ngoại lệ. Theo như tôi hiểu bạn không được phép sử dụng 'cặp đôi', do đó, vấn đề của' dput''ing nó là một chút tranh luận. – eddi

+0

Cảm ơn bạn đã trả lời @eddi, tại sao bạn không đặt câu trả lời đó? – Szabolcs

Trả lời

8

Tôi không có nhiều hơn nữa để thêm bên cạnh nhận xét của tôi, vì vậy đây là chỉ cho đầy đủ cho các thế hệ tương lai :)

dput làm những gì bạn muốn. Với ngoại lệ hiếm hoi, một trong số đó là pairlist (Tôi cho rằng có thể có các trường hợp ngoại lệ khác, nhưng tôi thực sự không biết chúng là gì), nó sẽ không chính xác cùng một đối tượng, nhưng, ít nhất là trong trường hợp pairlist Có một lý do cho điều đó. Vì pairlist không được sử dụng bên ngoài mã nội bộ, đầu ra của dput có thể được coi là làm cho người dùng ưu tiên bằng cách chuyển đổi một đối tượng bên trong thành tương đương bên ngoài.

+1

Có nhiều ngoại lệ hơn.Các môi trường là 'dput''ed đơn giản là" ", ngay cả khi chúng có thuộc tính. Các đóng đóng mất các thuộc tính 'srcref', môi trường kèm theo và mã byte (nếu có). –

2

dput là một giải pháp hơi thất vọng, vì kết quả là rất lộn xộn. (Đó là, tuy nhiên, tốt hơn những gì tôi đã làm trước đây.)

Tôi đề nghị (1) dput, (2) tạo một bản sao, (3) gán lớp cơ sở cho kết quả (như đã thấy trong dput) và (4) str.

Trong trường hợp này:

> 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

Tôi đã không sử dụng 'dput' trước đây, vì vậy tôi không biết cách tiếp cận chung chung này là như thế nào. Về cơ bản, đây là giải pháp tương tự @eddi đã đưa ra, nhưng với một số bước mới. Tôi đã học được rất nhiều từ câu trả lời của anh ấy và những bình luận ở trên. Những gì tôi viết ở đây chỉ là quá dài để có thể nhận xét về câu trả lời của anh ấy, điều đó đã đủ tốt rồi. Tôi hy vọng ai đó đến cùng với một câu trả lời thỏa mãn hơn, mặc dù. (Tôi đánh dấu sao câu hỏi.) '.Internal (inspect())' (mà @Joshua Ulrich đã đề cập) có thể là điều tốt nhất tiếp theo, nhưng tôi chưa lập trình đủ để đọc kết quả đó trong nháy mắt. – Frank

Các vấn đề liên quan