我想查看R&#39 {s} match.call
函数的源代码。由于它是一个内部函数,我下载了R源代码,转到./src/main/names.c并在那里查找match.call
。
因此,我发现相应的.c函数被称为do_matchcall
。好的,但是如何找出./src/main/中的几十个.c文件中包含哪个函数do_matchcall
?
顺便说一句,我使用Windows机器,以防万一。
答案 0 :(得分:10)
作为Windows用户,这里有几个选项。第一个是可取的,但第二个可以偶尔使用:
下载grepwin,这将允许您使用Joshua和Gavin都提到的强大的grep
命令搜索Windows目录。它(或某些等价物)是必不可少的,如果你在程序源目录中做很多事情的话。
使用this site处的搜索栏在R源目录中搜索do_matchcall
的定义。单击它返回的结果将告诉您do_matchcall
在文件unique.c的第1193行是“[defined]”,并将提供指向unique.c中代码的超链接。
就像我说的那样,如果你在Windows框中装载 grep
的某些实现,你最终会更开心。
答案 1 :(得分:8)
我知道很久以前就已经问过了这个问题,但由于它仍然具有相关性,我想我会添加一些人们用来查找正确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)))
这会将您带到this page,表明unique.c
包含do_matchcall函数。
我已将tab delimited file放在一起,构建在names.c
文件上,并使用 find-in-files 来确定来源的位置码。有些函数具有特定于平台的文件,还有一些函数具有多个具有相关源代码的文件。但对于其余部分,映射已经很好地建立起来,至少对于当前版本(3.1.2)而言。
答案 2 :(得分:6)
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}},
表示在这种情况下unique.c
是值得查看的地方。
据我所知,没有办法(除了调用对终端的系统调用之外)从R内部识别哪个源文件包含R中给定函数的C代码 - 好吧,不是没有重写{使用R代码{1}}或grep
或类似代码: - )
答案 3 :(得分:0)
不要下载实用程序进行一次性文件内容搜索。你可以使用findstr。它不适合完整的文件系统搜索,但我认为它非常适合您要做的事情。
<强> CMD 强>
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&gt; searchresult.txt
如果你想要行号
findstr / n do_matchcall
Findstr也支持正则表达式。要查看所有选项
findstr /?