2012-11-07 11 views
14

Chcę zobaczyć kod źródłowy funkcji R's match.call. Ponieważ jest to funkcja wewnętrzna, pobrałem kod źródłowy R, przeszedł do ./src/main/names.c i szukałem tam match.call.Jak się dowiedzieć, który plik .c zawiera funkcje .c wewnętrznych R, w systemie Windows?

W ten sposób dowiedziałem się, że odpowiednia funkcja .c nazywa się do_matchcall. Ok, ale jak mogę się dowiedzieć, który z dziesiątek plików .c w ./src/main/ zawiera funkcję do_matchcall?

Btw używam komputera z systemem Windows, w przypadku, który robi różnicę.

+5

+1 z powodów, dla których porzuciłem system Windows. '../ R-2.15.2/src> grep do_matchcall */*' zwraca 'main/unique.c' (między innymi). –

Odpowiedz

10

Jako użytkownik systemu Windows, jest kilka opcji. Pierwszym z nich jest lepszy, ale drugi jest OK do sporadycznego użytku:

  • Pobierz grepwin, które pozwalają na przeszukiwanie katalogów Windows, za pomocą potężnej grep polecenie, które zarówno Joshua i Gavin wspomniałem. To (lub jakiś inny odpowiednik) jest niezastąpione niezastąpione, jeśli będziesz robił dużo szturchanie w katalogach źródłowych programu.

  • Użyj paska wyszukiwania pod numerem this site, aby wyszukać katalog źródłowy R dla definicji do_matchcall. Kliknięcie wyniku, który zwróci, powie Ci, że do_matchcall jest "[zdefiniowane] w wierszu 1193 pliku unique.c" i dostarczy hiperłącze do kodu w unique.c.

Jak powiedziałem, chociaż, będziesz ostatecznie być o wiele szczęśliwsi, jeśli wyposażyć okno systemu Windows z niektóre realizacja grep.

+0

Wow, dzięki, strona, którą połączyłeś jest niesamowita. Idealny dla kogoś, kto tylko od czasu do czasu chce spojrzeć na jeden wewnętrzny R. –

+0

@ WolfgangPößnecker - Cieszę się, że pomaga. Pamiętaj, że link przerwie się, gdy R zostanie zaktualizowany. Aby to działało, po prostu edytuj "część wersji" http://fossies.org/dox/R-2.15.2/index.html z "R-2.15.2" na dowolną wersję. –

+0

@ WolfgangPößnecker: [wyszukiwanie 'do_matchcall' na rseek.org] (http://www.rseek.org/?cx=010923144343702598753%3Aboaz1reyxd4&q=do_matchcall&newwindow=1&cof=FORID%3A11) to kolejna alternatywa i [rseek.org ] (http://www.rseek.org/) jest ogólnie przydatny. –

6

Uwe Ligges napisał artykuł "R Help Desk" na ten sam temat w R News (2006, 6(4):43-45).

Po zidentyfikowaniu rzeczywistej używanej funkcji C użyj narzędzi wyszukiwania systemu plików do wyszukania nazwy funkcji w odpowiednim folderze źródłowym; w tym przypadku ./src/main/, np. w systemie 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}}, 

wskazująca, że ​​w tym przypadku należy szukać unique.c. Zgodnie z moją wiedzą, nie ma możliwości (oprócz wywoływania wywołania systemowego do terminala) zidentyfikowania z poziomu R, którego plik źródłowy zawiera kod C dla danej funkcji w R - cóż, nie bez przepisywania grep lub find lub podobny przy użyciu kodu R :-)

+0

Pozdrawiam twoją rekomendację artykułu Uwe Ligges. Jest to niezbędna lektura dla użytkowników R. –

+1

Dzięki za pomocną odpowiedź. Znałem już jednak wspomniany artykuł.Ale linie "Jeśli nazwa pliku nie jest oczywista, to można go znaleźć pod numerem " grep'ping dla ciągu znaków w R $ R_HOME/src/"nigdy nie miało dla mnie sensu, ponieważ nigdy nie korzystałem z Linuksa. Odpowiedź Josha O'Briena również pośrednio pokazuje, że "grep'ing nie jest" prosty "lub" naturalny "dla użytkownika systemu Windows. –

+0

Jako użytkownik inny niż Windows, zakładałem, że będziesz wiedział, jak wyszukiwać ciągi w plikach w systemie operacyjnym. Naprawdę to jest twoje pytanie i możesz uzyskać lepszą pomoc, jeśli napisałeś to jako Q (ale nie na [tak], ponieważ nie jest to problem programistyczny - SuperUser może być OK) zamiast kierowania tego na znacznik [tag: r] ludzie. –

8

Wiem, że zostało to zadane dawno temu, ale ponieważ jest to nadal istotne, pomyślałem, że dodam trochę zasobów, których ludzie mogą użyć do znalezienia właściwych plików źródłowych R.

  1. Po pierwsze, z pryr można używać funkcji show_c_source która wyszukiwania na GitHub odpowiedni kawałek kodu w plikach źródłowych C.

    body(match.call) 
    
    # .Internal(match.call(definition, call, expand.dots)) 
    
    pryr::show_c_source(.Internal(match.call(definition, call, expand.dots))) 
    

    który zabierze cię do this page, pokazując, że unique.c zawiera funkcję do_matchcall.

  2. I już ułożyła tej tab delimited file, opierając się na pliku names.c i korzystania znaleźć w swojej plików aby określić położenie kodu źródłowego. Istnieją pewne funkcje, które mają pliki specyficzne dla platformy i garść innych, dla których istnieje więcej niż jeden plik z odpowiednim kodem źródłowym. Ale dla reszty mapowanie jest dość dobrze ustalone, przynajmniej dla obecnej wersji (3.1.2).

+1

Plik rozdzielany tabulatorami w powyższej odpowiedzi jest cudownie pomocny! Dziękuję za udostępnienie. – dpritch

0

Nie pobieraj narzędzia do jednorazowego wyszukiwania zawartości plików. Możesz użyć findstr. Nie nadaje się do pełnego przeszukiwania systemu plików, ale myślę, że jest idealny do tego, co próbujesz zrobić.

  1. uruchom powłokę poleceń

cmd

  1. przejdź do katalogu (jeśli nie jesteś pewien, co ścieżka jest go znaleźć w badaczem, niż wyświetlić pełną ścieżkę, klikając w pasku adresu) Możesz skopiować/wkleić ten katalog.
    Jeśli ścieżka to C: \ Users \ jsmith \ Documents \ Projects \ szczęśliwy \ src \ main

cd c: \ Users \ jsmith \ Documents \ Projects \ szczęśliwy \ src \ main

  1. użycie findstr

findstr do_matchcall

jeśli chcesz szukać sub katalogi

findstr/s do_matchcall

jeśli tylko chcą wiedzieć, nazwa pliku

findstr/m do_matchcall

jeśli chcesz wysłać wyniki do innego pliku

findstr/s/m do__matchcall> searchresult.txt

jeśli chcesz numery linii

findstr/n do_matchcall

findstr obsługuje wyrażeń regularnych. Aby zobaczyć wszystkie opcje

findstr /?

+0

To prawdopodobnie nie ma zastosowania do konkretnego pytania, ale w przypadku wyszukiwania niewrażliwego na wielkość użyj/i findstr/i do_matchcall –

Powiązane problemy