16

我想查看Rmatch.call函数的源代码。因为它是一个内部函数,所以我下载了 R 源代码,去 ./src/main/names.c 并在match.call那里寻找。

因此,我发现调用了相应的 .c 函数do_matchcall。好的,但是我怎样才能找出 ./src/main/ 中的几十个 .c 文件中的哪一个包含该函数do_matchcall

顺便说一句,我使用的是 Windows 机器,以防万一。

4

4 回答 4

10

作为 Windows 用户,这里有几个选项。第一个更可取,但第二个偶尔使用也可以:

  • 下载grepwin,它将允许您使用grepJoshua 和 Gavin 都提到的强大命令搜索 Windows 目录。如果您要在程序源目录中做很多事情,它(或一些等效的)是必不可少的。

  • 使用此站点上的搜索栏在R 源目录中搜索do_matchcall. 单击它返回的结果将告诉您do_matchcall“在文件 unique.c 的第 1193 行 [已定义]”,并将提供指向 unique.c 中代码的超链接。

就像我说的,不过,如果你为你的 Windows 机器配备了一些grep.

于 2012-11-07T22:45:34.313 回答
9

我知道很久以前就有人问过这个问题,但由于它仍然相关,我想我会添加一些人们可以用来查找正确 R 源文件的资源。

  1. 首先,使用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

  2. 我已经把这个制表符分隔的文件放在一起,建立在names.c文件上并使用文件中查找来确定源代码的位置。有一些函数具有特定于平台的文件,还有一些函数有多个具有相关源代码的文件。但是对于其余部分,映射已经很好地建立了,至少对于当前版本(3.1.2)。

于 2015-04-17T10:40:23.457 回答
6

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 代码 - 好吧,不是没有重写grepfind类似使用R代码:-)

于 2012-11-07T22:36:40.050 回答
1

不要下载用于一次性文件内容搜索的实用程序。您可以使用 findstr。它不适合完整的文件系统搜索,但我认为它非常适合您尝试做的事情。

  1. 运行命令外壳

命令

  1. 转到目录(如果您不确定路径是什么,请在资源管理器中找到它,而不是通过单击地址栏查看完整路径)您可以复制/粘贴该目录。
    如果路径是 C:\Users\jsmith\documents\projects\happy\src\main

cd C:\Users\jsmith\documents\projects\happy\src\main

  1. 使用 findstr

findstr do_matchcall

如果你想搜索子目录

findstr /s do_matchcall

如果只想知道文件名

findstr /m do_matchcall

如果要将结果发送到另一个文件

findstr /s /m do__matchcall >searchresult.txt

如果你想要行号

findstr /n do_matchcall

Findstr 还支持正则表达式。查看所有选项

查找str /?

于 2016-06-07T12:15:40.853 回答