34

大量の関数を含む不十分な形式のモノリシック R コードの大きな塊が与えられたので、どの関数がどの関数を呼び出すかを調べたいと思います。

私は roxygen の @callGraph のものを使用できると思っていましたが、a) コードはパッケージに含まれている必要があり、これはこのコードでは頭痛の種になり、b) シンプルな環境で実行しても機能しないようです。私のパッケージ。Rgraphviz の依存関係のためにコール グラフの生成が無効になっているという Roxygen の作成者の 1 人からの投稿を見ましたが、コードはそこにあります。ともかく。

foo が bar、baz、および qux を呼び出し、qux が quux を呼び出すことをすばやく解決するためのより良い方法を知っている人はいますか?

編集: R のプロファイリング システムに基づくソリューションは、実際にコードを実行できると仮定すると、優れています...ファイル内の半分は実行されず、それが何をするのかわかりません...静的分析は多すぎます期待しているのだろう。

編集 2: Roxygen の呼び出しグラフは、関数の式の再帰的降下と is.callable のチェックに基づいて、静的分析を行うようです。これを任意の関数で実行できるといいですね...明日これで遊ぶかもしれません...

4

4 に答える 4

5

profrはあなたを助けますか?ドキュメントから:

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

ここに画像の説明を入力してください

あなたが何を求めているのかは完全ではありませんが、あなたはそれをあなたのニーズに適応させることができるかもしれません。

于 2011-01-25T16:24:08.827 に答える
4

CodeDependsパッケージ ( CRANwebsiteGitHub ) は面白そうですが、調べていません。とりわけ、それは約束します

  • 関数セット間のコール グラフの作成

おそらくmakeCallGraph()機能によるものです。

于 2016-01-19T14:33:17.720 に答える
2

私はそれを使用していませんが、proftoolsパッケージをざっと見てみると、これが可能であることがわかります。最初にRprofを実行してから、proftoolsを使用して出力を分析する必要があります。機能が欲しいと思いますplotProfileCallGraph()

于 2011-01-25T16:25:40.857 に答える
2

proftools と profr の他に、Romain による Perl スクリプトが R Wiki にあります。graphviz と組み合わせると、(エッジが重み付けされた) グラフが表示されます。詳細については、こちらを参照してください。

于 2011-01-25T16:49:32.330 に答える