如何在Windows上找出哪个.c文件包含R内部的.c功能?

时间:2012-11-07 22:20:07

标签: r windows function internals

我想查看R&#39 {s} match.call函数的源代码。由于它是一个内部函数,我下载了R源代码,转到./src/main/names.c并在那里查找match.call

因此,我发现相应的.c函数被称为do_matchcall。好的,但是如何找出./src/main/中的几十个.c文件中包含哪个函数do_matchcall

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

4 个答案:

答案 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源文件的资源。

  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. 我已将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。它不适合完整的文件系统搜索,但我认为它非常适合您要做的事情。

  1. 运行命令shell
  2. <强> CMD

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

      1. 使用findstr
      2. 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 /?