【问题标题】:How to find out which .c file contains the .c functions of R internals, on Windows?如何在 Windows 上找出哪个 .c 文件包含 R 内部的 .c 函数?
【发布时间】:2012-10-28 01:43:33
【问题描述】:

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

于是,我发现对应的.c函数叫做do_matchcall。好的,但是如何找出 ./src/main/ 中的几十个 .c 文件中的哪个包含函数 do_matchcall

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

【问题讨论】:

  • +1 因为我放弃了 Windows。 ../R-2.15.2/src> grep do_matchcall */* 返回main/unique.c(等等)。

标签: r windows function internals


【解决方案1】:

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 代码 - 好吧,不是不重写 @ 987654328@ 或 find 或类似使用 R 代码:-)

【讨论】:

  • 我会支持你对 Uwe Ligges 文章的推荐。这是 R 用户的必备读物。
  • 感谢您的帮助。但是,我已经知道引用的文章。但是“如果文件名不明显,那么可以通过简单地‘grep’ping R 的 $R_HOME/src/ 中的字符串来找到它”这句话对我来说从来没有意义,因为我从未使用过 Linux。 Josh O'Brien 的回答也间接表明,对于 Windows 用户来说,“grep”并不是“简单”或“自然”。
  • 作为非 Windows 用户,我假设您知道如何在操作系统的文件中搜索字符串。这确实是您的问题,如果您将其写为 Q(但不是在 Stack Overflow 上,因为它不是编程问题 - 超级用户可能没问题),而不是将其指向 r 标记人员,您可能会得到更好的帮助。
  • 好吧,虽然你显然是对的,但当我发布它时,我根本不知道我的问题是指一个特定于 Windows 的实用程序。我在想存在一些特定于 R 的功能或实用程序或技巧来解决我的问题。在你回答之前,我没有意识到我的问题是不恰当的。
  • @WolfgangPößnecker 我认为您的问题不一定是不恰当的。我只是指出我在回答时做出了某些假设。您问题的真正答案是,没有类似的 R 实用程序可以为您提供所需的东西。我也许也应该这么说...而且这种情况经常发生 - 真正的问题演变来自“讨论”或您在Stack Overflow 上提供的答案。
【解决方案2】:

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

  • 下载 grepwin,这将允许您使用 Joshua 和 Gavin 都提到的强大的 grep 命令搜索 Windows 目录。如果您要在程序源目录中进行大量探索,那么它(或类似的东西)是必不可少的

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

不过,就像我说的那样,如果你为你的 Windows 机器配备 一些 grep 的实现,你最终会更快乐。

【讨论】:

  • 哇,谢谢,您链接的网站很棒。非常适合只偶尔想查找单个 R 内部的人。
  • @WolfgangPößnecker -- 很高兴有帮助。请注意,下次更新 R 时链接将断开。要使其工作,只需将fossies.org/dox/R-2.15.2/index.html 的“版本部分”从“R-2.15.2”编辑为当前版本。
  • @WolfgangPößnecker:searching for do_matchcall on rseek.org 是另一种选择,rseek.org 通常很方便。
  • 谷歌魔法也是一个选项site:https://svn.r-project.org/R/trunk/src/ do_matchcall
【解决方案3】:

我知道很久以前就有人问过这个问题,但由于它仍然相关,我想我应该添加一些资源,人们可以使用它来找到合适的 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)))
    

    带你到this page,表明unique.c包含函数do_matchcall

  2. 我在names.c 文件的基础上整理了这个tab delimited file,并使用find-in-files 来确定源代码的位置。有一些函数具有特定于平台的文件,还有一些函数有多个具有相关源代码的文件。但对于其余部分,映射已经非常完善,至少对于当前版本 (3.1.2)。

【讨论】:

  • 上述答案中的制表符分隔文件非常有用!感谢分享。
【解决方案4】:

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

  1. 运行命令外壳

cmd

  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 还支持正则表达式。查看所有选项

findstr /?

【讨论】:

  • 这可能不适用于您的具体问题,但对于不区分大小写的搜索,请使用 /i findstr /i do_matchcall
猜你喜欢
  • 1970-01-01
  • 2016-10-11
  • 1970-01-01
  • 2011-07-08
  • 2020-09-23
  • 2021-02-17
  • 2017-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多