Как узнать, какой файл .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
- перейдите в каталог (если вы не знаете, что такое путь, найдите его в проводнике, чем просмотрите полный путь, щелкнув в адресной строке). Вы можете скопировать/вставить этот каталог.
Если путь: C:\Users\jsmith\documents\projects\happy\src\main
cd C:\Users\jsmith\documents\projects\happy\src\main
- использовать 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/?