Как узнать, какой файл .c содержит .c функции внутренних внутренних элементов R, в Windows?

Я хочу просмотреть исходный код функции R match.call. Поскольку это внутренняя функция, я загрузил исходный код R, перешел в. /src/main/names.c и искал там match.call.

Таким образом, я узнал, что соответствующая функция .c называется do_matchcall. Хорошо, но как я могу узнать, какой из десятков файлов .c в./src/main/содержит функцию do_matchcall?

Btw Я использую машину Windows, в случае, если это имеет значение.

Ответ 1

Как пользователь Windows, вот несколько вариантов. Первый предпочтительнее, но второй вариант подходит для случайного использования:

  • Загрузите grepwin, что позволит вам искать каталоги Windows с помощью мощной команды grep, которая как Joshua, так и Gavin упомянув. Он (или какой-то эквивалент) незаменим, если вы будете много пикать в исходных каталогах программ.

  • Используйте панель поиска на этом сайте, чтобы найти исходный каталог R для определения do_matchcall. Нажав на результат, который он возвращает, вы скажете, что do_matchcall имеет значение "[определено] в строке 1193 файла unique.c" и будет предоставлять гиперссылку на код в unique.c.

Как я уже сказал, вы, в конечном счете, будете намного счастливее, если укомплектовываете свою коробку Windows некоторой реализацией grep.

Ответ 2

Я знаю, что это было задано давно, но поскольку это все еще актуально, я подумал, что добавлю некоторые ресурсы, которые люди могут использовать для поиска правильных исходных файлов 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)))
    

    Это приведет вас к этой странице, показывая, что unique.c содержит функцию do_matchcall.

  • Я собрал этот файл с разделителями табуляций, основанный на файле names.c и использующий find-in-files для определить местоположение исходного кода. Существуют некоторые функции, имеющие файлы, специфичные для платформы, и несколько других, для которых имеется более одного файла с соответствующим исходным кодом. Но для остальных отображение довольно хорошо установлено, по крайней мере для текущей версии (3.1.2).

Ответ 3

Уве Лиггес написал статью "R Help Desk" по этой теме в R News (2006, 6 (4): 43-45).

После того, как вы определили фактическую функцию 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, исходный файл содержит код C для данной функции в R - ну, не переписывая grep или find или с помощью R-кода: -)

Ответ 4

Не загружайте утилиту для одноразового поиска содержимого файла. Вы можете использовать findstr. Он не подходит для полного поиска файловой системы, но я думаю, что он идеально подходит для того, что вы пытаетесь сделать.

  • запустите командную оболочку

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/?