2016-07-23 55 views
1

我想知道是否有任何自動化方式可以檢查給定包中的R函數是否依賴於C/C++編譯代碼來執行大部分執行,或者是否在純R中實現?當然,我可以看看源代碼,自己看看它是如何實現的,但我正在尋找會像檢查R函數是否依賴於C/C++編譯代碼的函數?

iscompiled(somepackage::fun) 
TRUE 
的情況下,功能

在包somepackagefun()使用引擎蓋下編譯的C/C++代碼而不是在純R中實現。我想可以檢查Rcpp上的包的整體依賴性,但是這仍然不會說C/C++中該包中單個函數的依賴性。我當然知道,大多數基礎R函數已經使用編譯的C/C++代碼,這不是我的觀點......任何想法?檢查該函數的源代碼中是否出現.C.CallsourceCpp

+1

不知道R,但是它是用C語言寫的(部分),或者最終從某個階段的標準庫或系統調用中調用C函數。由於所有操作系統都有C代碼,因此**每個** R程序都依賴於C代碼。那麼你的觀點是什麼? – Olaf

回答

6

如果函數是f那麼這將是TRUE如果f直接調用C/C++或Fortran代碼。它搜索在函數體的`調用:

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

注意,如果f間接調用這樣的代碼,例如,f電話g這反過來又調用那麼上面將返回FALSE爲f但TRUE爲g。同樣,如果f是一個S3泛型,然後調用特定的方法,然後一個方法執行調用,那麼上述將返回FALSE爲f,但對於直接調用C/C++或Fortran的任何方法f.X,則返回TRUE。

+0

非常感謝!這就是我一直在尋找的東西!間接呼叫確實很難追查下來....正則表達式可以最好地適應我想要尋找「.C(」,「.Call(」,「cxxfunction(」或「cfunction(」。 –

+1

)你應該還檢查.Primitive,。內部和.C。 – Roland

+0

如果@TomWenseleers想讓這一點,需要一個字符參數,他將不得不國防部這一點的功能。 – hrbrmstr