我想查看Rmatch.call
函数的源代码。因为它是一个内部函数,所以我下载了 R 源代码,去 ./src/main/names.c 并在match.call
那里寻找。
因此,我发现调用了相应的 .c 函数do_matchcall
。好的,但是我怎样才能找出 ./src/main/ 中的几十个 .c 文件中的哪一个包含该函数do_matchcall
?
顺便说一句,我使用的是 Windows 机器,以防万一。
作为 Windows 用户,这里有几个选项。第一个更可取,但第二个偶尔使用也可以:
下载grepwin,它将允许您使用grep
Joshua 和 Gavin 都提到的强大命令搜索 Windows 目录。如果您要在程序源目录中做很多事情,它(或一些等效的)是必不可少的。
使用此站点上的搜索栏在R 源目录中搜索do_matchcall
. 单击它返回的结果将告诉您do_matchcall
“在文件 unique.c 的第 1193 行 [已定义]”,并将提供指向 unique.c 中代码的超链接。
就像我说的,不过,如果你为你的 Windows 机器配备了一些grep
.
我知道很久以前就有人问过这个问题,但由于它仍然相关,我想我会添加一些人们可以用来查找正确 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)))
这会将您带到此页面,显示unique.c
包含函数do_matchcall。
我已经把这个制表符分隔的文件放在一起,建立在names.c
文件上并使用文件中查找来确定源代码的位置。有一些函数具有特定于平台的文件,还有一些函数有多个具有相关源代码的文件。但是对于其余部分,映射已经很好地建立了,至少对于当前版本(3.1.2)。
Uwe Ligges 在R News (2006, 6(4):43-45)上写了一篇关于这个主题的“R Help Desk”文章。
一旦确定了实际使用的 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}},
表明这unique.c
是在这种情况下看的地方。
据我所知,没有办法(除了调用对终端的系统调用)从 R 中识别哪个源文件包含 R 中给定函数的 C 代码 - 好吧,不是没有重写grep
或find
类似使用R代码:-)
不要下载用于一次性文件内容搜索的实用程序。您可以使用 findstr。它不适合完整的文件系统搜索,但我认为它非常适合您尝试做的事情。
命令
cd C:\Users\jsmith\documents\projects\happy\src\main
findstr do_matchcall
如果你想搜索子目录
findstr /s do_matchcall
如果只想知道文件名
findstr /m do_matchcall
如果要将结果发送到另一个文件
findstr /s /m do__matchcall >searchresult.txt
如果你想要行号
findstr /n do_matchcall
Findstr 还支持正则表达式。查看所有选项
查找str /?