我想知道是否有任何自动方式可以检查给定包中的R函数是否依赖于C / C ++编译代码来执行大部分操作,或者是否实现了它在纯R?我当然可以自己查看源代码,看看它是如何实现的,但我要找的是
iscompiled(somepackage::fun)
TRUE
如果包fun()
中的函数somepackage
使用编译的C / C ++代码而不是在纯R中实现,我想可以检查包的整体依赖性{ {1}},但这仍然无法说明C / C ++中该软件包中各个函数的依赖性。我当然知道大多数基本R函数已经使用了编译的C / C ++代码,这不是我的观点......有什么想法吗?检查该函数源代码中Rcpp
,.C
或.Call
的出现次数?
答案 0 :(得分:6)
如果函数是f
,那么如果f
直接调用C / C ++或Fortran代码,则该值为TRUE。它在函数体中搜索``invocation:
any(grepl("\\b\\.(Call|Primitive|Internal|External|C|Fortran)\\b", body(match.fun(f))))
请注意,如果f
间接调用此类代码,例如,f
调用g
而调用f
则上面的代码将返回FALSE { {1}}但g
为真。类似地,如果f
是S3泛型,它反过来调用特定方法并且方法执行调用,那么上面将为f
返回FALSE,但对于直接调用C / C ++或Fortran的任何方法fX都返回TRUE。