2016-07-23 10 views
1

私は、あるパッケージのR関数が実行のほとんどのためにC/C++のコンパイルされたコードに依存しているかどうか、あるいは代わりに純粋なRに実装されているかどうかをチェックできる自動化された方法があるのだろうか?私は、もちろんソースコードを自分自身を見て、それが実現しています方法を見て、私は探しています何がパッケージsomepackagefun()は、ボンネットの下にC/C++コードをコンパイル使用していた何かの場合機能でR関数がC/C++コンパイル済みコードに依存しているかどうかをチェックする関数?

iscompiled(somepackage::fun) 
TRUE 

ようになる可能性純粋なRで実装されているのとは対照的に、私はRcppのパッケージの全体的な依存関係を調べることができると思いますが、これはC/C++のパッケージ内の個々の関数の依存性については何も言いません。もちろん、ベースのR関数のほとんどはすでにコンパイルされたC/C++コードを使用していることは知っていますが、それは私の問題ではありません。その機能のソースコードに.C.CallまたはsourceCppの出現を確認していますか?

+1

Rはわかりませんが、C言語で書かれているか、最終的にはある段階で標準ライブラリからC関数を呼び出すか、またはsyscallを呼び出します。すべてのOSがCコードを持っているので** Rプログラムは毎回Cコードに依存しています。あなたのポイントは何ですか? – Olaf

答えて

6

関数がfの場合、fが直接がC/C++またはFortranコードを呼び出すとTRUEになります。間接的であればf呼び出しなどのコード、例えば、順番に呼び出していf通話gはその後、上記fためFALSEが、TRUEが返されますことを

any(grepl("\\b\\.(Call|Primitive|Internal|External|C|Fortran)\\b", body(match.fun(f)))) 

注:これは、関数の本体内の `の呼び出しを検索しますgの場合同様にfが特定のメソッドを呼び出すS3ジェネリックで、メソッドが呼び出しを実行する場合、上記はFALSEをfに返しますが、C/C++またはFortranを直接呼び出すメソッドf.Xに対してTRUEを返します。

+0

多くの感謝!それは私が探していたものです!間接呼び出しは本当に追跡するのが難しいでしょう。正規表現は、 ".C("、 ".Call("、 "cxxfunction("または "cfunction("。 –

+1

.Primitive、.Internal、.Cもチェックしてください。 – Roland

+0

@TomWenseleersがこれを文字引数をとる関数にしたいのであれば、これを少し修正する必要があります。 – hrbrmstr

関連する問題