2011-01-25 40 views
25

Tôi đã được cung cấp một đoạn lớn mã R có định dạng nguyên khối kém với nhiều chức năng và tôi muốn tìm ra chức năng nào gọi hàm nào.Tạo biểu đồ cuộc gọi trong R

Tôi nghĩ tôi có thể sử dụng công cụ @callGraph của roxygen, nhưng a) mã cần phải nằm trong gói, sẽ là một nhức đầu với mã này và b) thậm chí nó không hoạt động khi tôi chạy nó trên một gói đơn giản của tôi. Tôi thấy một bài đăng từ một trong những tác giả của Roxygen nói rằng việc tạo đồ thị cuộc gọi bị vô hiệu hóa vì sự phụ thuộc của Rgraphviz, nhưng mã đó là ở đó. Dù sao.

Bất cứ ai cũng có cách nhanh hơn để nhanh chóng thực hiện foo đó gọi là bar, baz và qux, và qux đó gọi quux?

Chỉnh sửa: Các giải pháp dựa trên hệ thống lược tả của R rất tuyệt, giả sử bạn thực sự có thể chạy mã ... Một nửa nội dung trong tệp không chạy, và tôi không biết nó làm gì ... phân tích là quá nhiều để hy vọng, tôi đoán.

Chỉnh sửa 2: Công cụ đồ thị cuộc gọi của Roxygen dường như thực hiện phân tích tĩnh, dựa trên gốc đệ quy của biểu thức hàm và kiểm tra is.callable. Sẽ thật đáng yêu khi có thể chạy điều này trên bất kỳ chức năng nào ... Tôi có thể chơi với ngày mai này ...

Trả lời

17

Bạn có thể xem chức năng 'foodweb' từ gói 'mvbutils' trên CRAN. Đây là một liên kết đến một bài viết mô tả việc sử dụng của nó:

http://www.r-bloggers.com/r-function-of-the-day-foodweb-2/

Disclaimer: đây là trang web của tôi và tôi đã viết bài viết đó.

+0

Tôi đã suy nghĩ về ý tưởng viết một hàm sẽ làm một cái gì đó chính xác như thế này. Và đó là đúng về thời điểm bạn đăng bài đăng trên blog. Tư tưởng lớn gặp nhau? :) –

+1

Khá chính xác những gì tôi đã làm sau. Bây giờ để biến đầu ra thành định dạng dấu chấm, hoặc có thể tải nó vào một số gói biểu đồ R khác ... – Spacedman

3

Có thể giúp bạn? Từ các tài liệu:

> ?profr 
> glm_ex <- profr(example(glm)) 
Read 17 items 
>  head(glm_ex) 
      f level time start end leaf source 
8  example  1 0.32 0.00 0.32 FALSE utils 
9 <Anonymous>  2 0.04 0.00 0.04 FALSE <NA> 
10  source  2 0.28 0.04 0.32 FALSE base 
11 prepare_Rd  3 0.02 0.00 0.02 FALSE <NA> 
12  render  3 0.02 0.02 0.04 FALSE <NA> 
13 getSrcLines  3 0.02 0.04 0.06 FALSE base 
>  summary(glm_ex) 
       f   level    time   start  
eval.with.vis :10 Min. : 1.000 Min. :0.02 Min. :0.0000 
<Anonymous> : 3 1st Qu.: 4.000 1st Qu.:0.02 1st Qu.:0.1200 
lazyLoadDBfetch: 3 Median : 6.000 Median :0.02 Median :0.2000 
%in%   : 3 Mean : 7.211 Mean :0.03 Mean :0.1769 
inherits  : 3 3rd Qu.: 9.000 3rd Qu.:0.02 3rd Qu.:0.2600 
is.factor  : 3 Max. :22.000 Max. :0.32 Max. :0.3000 
(Other)  :65             
     end   leaf   source   
Min. :0.0200 Mode :logical Length:90   
1st Qu.:0.1500 FALSE:75  Class :character 
Median :0.2400 TRUE :15  Mode :character 
Mean :0.2069 NA's :0       
3rd Qu.:0.2800          
Max. :0.3200          

> plot(glm_ex) 

enter image description here

Không khá gì bạn đang sau, nhưng bạn có thể điều chỉnh nó cho nhu cầu của bạn.

1

Tôi chưa sử dụng, nhưng xem nhanh gói proftools cho biết rằng nó có thể thực hiện việc này. Bạn sẽ phải chạy Rprof trước và sau đó sử dụng các proftools để phân tích đầu ra. Tôi nghĩ bạn muốn có chức năng plotProfileCallGraph().

3

Bên cạnh proftools và profr, có kịch bản Perl của Romain trên R Wiki. Kết hợp với graphviz, nó làm đồ thị (với các cạnh có trọng số) - xem here để biết thêm.

+0

Tốt. Liệu nó có phải đi trong thư mục bin R? Dường như nó chạy như một tập lệnh ./Rprof2dot perl, và tôi không thể thấy bất kỳ phụ thuộc R nào ... – Spacedman

+0

Khi tôi sử dụng kịch bản perl, tôi chỉ giữ nó trong một đường dẫn cục bộ hoặc thư mục hiện tại. Nó chưa được tích hợp đầy đủ với R. –

+0

Liên kết giờ đã chết. – qed

2

Gói CodeDepends (CRAN, website, GitHub) có vẻ thú vị, tôi chưa xem xét nó. Trong số những người khác, nó hứa hẹn

  • tạo đồ thị cuộc gọi giữa các bộ chức năng

lẽ qua makeCallGraph() chức năng.

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