检查 R 函数是否依赖于 C/C++ 编译代码的函数?
Function to check if R function relies on C/C++ compiled code?
我想知道是否有任何自动化的方法可以检查给定包中的 R 函数是否依赖于 C/C++ 编译代码来执行大部分代码,或者它是否以纯代码实现R?我当然可以自己查看源代码,看看它是如何实现的,但我正在寻找的是
iscompiled(somepackage::fun)
TRUE
万一包 somepackage
中的函数 fun()
在后台使用编译的 C/C++ 代码,而不是在纯 R 中实现。我想可以检查整体包对 Rcpp
的依赖性,但这仍然不能说明该包中各个函数对 C/C++ 的依赖性。我当然知道大多数基本 R 函数已经使用编译的 C/C++ 代码,这不是我的意思......有什么想法吗?检查该函数的源代码中是否出现 .C
、.Call
或 sourceCpp
?
如果函数是 f
那么如果 f
直接 调用 C/C++ 或 Fortran 代码,这将为 TRUE。它在函数体中搜索`invocation:
any(grepl("\b\.(Call|Primitive|Internal|External|C|Fortran)\b", body(match.fun(f))))
请注意,如果 f
间接地 调用此类代码,例如,f
调用 g
而后者又调用了上述代码return f
为假,g
为真。类似地,如果 f
是一个 S3 泛型,它又调用特定的方法并且一个方法执行调用,那么上面的 return 对于 f
是假的,但对于任何方法 f.X 都是真直接调用 C/C++ 或 Fortran.
我想知道是否有任何自动化的方法可以检查给定包中的 R 函数是否依赖于 C/C++ 编译代码来执行大部分代码,或者它是否以纯代码实现R?我当然可以自己查看源代码,看看它是如何实现的,但我正在寻找的是
iscompiled(somepackage::fun)
TRUE
万一包 somepackage
中的函数 fun()
在后台使用编译的 C/C++ 代码,而不是在纯 R 中实现。我想可以检查整体包对 Rcpp
的依赖性,但这仍然不能说明该包中各个函数对 C/C++ 的依赖性。我当然知道大多数基本 R 函数已经使用编译的 C/C++ 代码,这不是我的意思......有什么想法吗?检查该函数的源代码中是否出现 .C
、.Call
或 sourceCpp
?
如果函数是 f
那么如果 f
直接 调用 C/C++ 或 Fortran 代码,这将为 TRUE。它在函数体中搜索`invocation:
any(grepl("\b\.(Call|Primitive|Internal|External|C|Fortran)\b", body(match.fun(f))))
请注意,如果 f
间接地 调用此类代码,例如,f
调用 g
而后者又调用了上述代码return f
为假,g
为真。类似地,如果 f
是一个 S3 泛型,它又调用特定的方法并且一个方法执行调用,那么上面的 return 对于 f
是假的,但对于任何方法 f.X 都是真直接调用 C/C++ 或 Fortran.