2016-07-23 63 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