我知道很久以前就已经问过这个了,但是因为它仍然有用,我想我会添加一些人们可以用来找到合适的R源文件的资源.
首先,使用pryr,您可以使用show_c_source
将在GitHub上搜索C源文件中相关代码段的函数.
body(match.call)
# .Internal(match.call(definition, call, expand.dots))
pryr::show_c_source(.Internal(match.call(definition, call, expand.dots)))
Run Code Online (Sandbox Code Playgroud)
这将带你到这个页面,显示unique.c
包含函数do_matchcall.
我已经将这个制表符分隔文件放在一起,构建在names.c
文件上并使用find-in-files来确定源代码的位置.有些函数具有特定于平台的文件,还有一些函数具有多个具有相关源代码的文件.但对于其余部分,映射已经很好地建立,至少对于当前版本(3.1.2)而言.
Uwe Ligges在R News( 2006,6 (4):43-45)中写了一篇关于这个主题的"R帮助台"文章.
一旦确定了所使用的实际C函数,就可以使用文件系统搜索工具在相关的源文件夹中搜索函数名称; 在这种情况下./src/main/
,例如在Linux上
$ grep -r -H "do_matchcall" ./src/main/
./src/main/.svn/text-base/names.c.svn-base:{"match.call", do_matchcall, 0, 11, 3, {PP_FUNCALL, PREC_FN, 0}},
./src/main/.svn/text-base/unique.c.svn-base:SEXP attribute_hidden do_matchcall(SEXP call, SEXP op, SEXP args, SEXP env)
./src/main/unique.c:SEXP attribute_hidden do_matchcall(SEXP call, SEXP op, SEXP args, SEXP env)
./src/main/names.c:{"match.call", do_matchcall, 0, 11, 3, {PP_FUNCALL, PREC_FN, 0}},
Run Code Online (Sandbox Code Playgroud)
表明这unique.c
是在这种情况下的地方.
据我所知,没有办法(比调用的系统调用终端之外)从R内,以确定哪些源文件包含R中一个给定的函数的C代码-好,不无需重写grep
或find
或类似的使用R代码:-)