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

Wol*_*ker 14 windows r function internals

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

因此,我发现调用了相应的.c函数do_matchcall.好的,但是如何找出./src/main/中的几十个.c文件中包含哪些功能do_matchcall

顺便说一句,我正在使用Windows机器,以防万一.

Jos*_*ien 10

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

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

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

就像我说的那样,如果你为你的Windows盒装备一些实现,你最终会更开心grep.


Dom*_*ois 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)))
    
    Run Code Online (Sandbox Code Playgroud)

    这将带你到这个页面,显示unique.c包含函数do_matchcall.

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


Rei*_*son 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}},
Run Code Online (Sandbox Code Playgroud)

表明这unique.c是在这种情况下的地方.

据我所知,没有办法(比调用的系统调用终端之外)从R内,以确定哪些源文件包含R中一个给定的函数的C代码-好,不无需重写grepfind或类似的使用R代码:-)