2012-11-07 14 views
14

Desidero visualizzare il codice sorgente della funzione R match.call. Essendo una funzione interna, ho scaricato il codice sorgente R, sono andato su ./src/main/names.c e ho cercato match.call lì.Come scoprire quale file .c contiene le funzioni .c di R internals, su Windows?

Così, ho scoperto che la corrispondente funzione .c è chiamata do_matchcall. Ok, ma come faccio a sapere quale delle dozzine di file .c in ./src/main/ contiene la funzione do_matchcall?

Btw Sto usando una macchina Windows, nel caso questo faccia la differenza.

+5

+1 per motivi per cui ho abbandonato Windows. '../ R-2.15.2/src> grep do_matchcall */*' restituisce 'main/unique.c' (tra gli altri). –

risposta

10

Come utente Windows, ecco un paio di opzioni. Il primo è preferibile, ma la seconda è OK per un uso occasionale:

  • Scarica grepwin, che vi permetterà di cercare le directory di Windows utilizzando il potente grep comando che sia Giosuè e Gavin hanno parlato. È (o qualche equivalente) è indispensabile se si sta andando a sbirciare nelle directory dei sorgenti del programma.

  • Utilizzare la barra di ricerca a this site per cercare nella directory di origine R la definizione di do_matchcall. Facendo clic sul risultato restituito verrà indicato che do_matchcall è "[definito] alla riga 1193 del file unique.c" e fornirà un collegamento ipertestuale al codice in unique.c.

Come ho detto, però, sarete in ultima analisi, molto più felice se si dotare la tua casella di Windows con alcuni attuazione grep.

+0

Wow, grazie, il sito che hai collegato è fantastico. Perfetto per qualcuno che solo occasionalmente vuole cercare un singolo R interno. –

+0

@ WolfgangPößnecker - Felice che aiuti. Tieni presente che il collegamento si interromperà quando R verrà aggiornato. Per farlo funzionare, basta modificare la "versione" di http://fossies.org/dox/R-2.15.2/index.html da "R-2.15.2" a qualunque versione sia. –

+0

@ WolfgangPößnecker: [la ricerca di 'do_matchcall' su rseek.org] (http://www.rseek.org/?cx=010923144343702598753%3Aboaz1reyxd4&q=do_matchcall&newwindow=1&cof=FORID%3A11) è un'altra alternativa e [rseek.org ] (http://www.rseek.org/) è a portata di mano in generale. –

6

Uwe Ligges ha scritto un articolo "R Help Desk" su questo argomento in R News (2006, 6(4):43-45).

Una volta identificata la funzione C effettiva utilizzata, utilizzare gli strumenti di ricerca del file system per cercare il nome della funzione nella relativa cartella di origine; in questo caso ./src/main/, ad es. su 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}}, 

indicando che unique.c è il posto giusto da cercare in questo caso.

In base alle mie conoscenze, non c'è modo (a parte invocare una chiamata di sistema al terminale) per identificare da R quale file di origine contiene il codice C per una determinata funzione in R - beh, non senza riscrivere grep o find o simile usando il codice R :-)

+0

Seguirò la tua raccomandazione sull'articolo di Uwe Ligges. È una lettura essenziale per gli utenti R. –

+1

Grazie per la tua risposta utile. Tuttavia, conoscevo già l'articolo di riferimento.Ma le righe "Se il nome del file non è ovvio, allora può essere trovato da semplicemente 'grep'ping per la stringa in R $ R_HOME/src /" non ha mai avuto senso per me dato che non ho mai usato Linux. La risposta di Josh O'Brien mostra anche indirettamente che 'grep'ing non è thaaaat' semplice 'o' naturale 'per un utente di Windows. –

+0

Come utente non Windows, supponevo che avresti saputo come cercare le stringhe nei file sul tuo sistema operativo. In realtà questa è la tua domanda e potresti ottenere un aiuto migliore se lo hai scritto come Q (ma non su [così] poiché non è un problema di programmazione - SuperUser potrebbe essere OK) invece di indirizzare questo al tag [tag: r] persone. –

8

So che questo è stato chiesto molto tempo fa, ma poiché è ancora pertinente, ho pensato di aggiungere alcune risorse che le persone possono utilizzare per trovare i file sorgente R corretti.

  1. In primo luogo, con pryr si può fare utilizzare la funzione show_c_source che cercare su GitHub pezzo rilevante del codice nei file sorgente C.

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

    che porta a this page, dimostrando che unique.c contiene la funzione do_matchcall.

  2. Ho messo insieme questo tab delimited file, costruendo sul file names.c e utilizzando find-a-file per determinare la posizione del codice sorgente. Esistono alcune funzioni con file specifici della piattaforma e una manciata di altre per le quali esiste più di un file con codice sorgente pertinente. Ma per il resto la mappatura è abbastanza consolidata, almeno per la versione attuale (3.1.2).

+1

Il file delimitato da tabulazione nella risposta sopra è meravigliosamente utile! Grazie per la condivisione. – dpritch

0

Non scaricare un'utilità per la ricerca di un file di una volta. Puoi usare findstr. Non è adatto per una ricerca completa di file system, ma penso che sia perfetto per quello che stai cercando di fare.

  1. eseguire la shell dei comandi

cmd

  1. andare alla directory (se non siete sicuri di cosa il percorso è, trovare in explorer di visualizzare il percorso completo facendo clic sulla barra degli indirizzi) È possibile copiare/incollare quella directory.
    Se il percorso è C: \ Users \ jsmith \ documenti \ projects \ felice \ src \ principali

cd C: \ Users \ jsmith \ Documenti \ projects \ felice \ src \ principale

  1. uso findstr

findstr do_matchcall

se si desidera cercare sub directory

findstr/s do_matchcall

se solo vogliono sapere il nome del file

findstr/m do_matchcall

se si desidera inviare i risultati a un altro file

findstr/s/m do__matchcall> searchresult.txt

se si desidera che i numeri di riga

findstr/n do_matchcall

Findstr supporta anche le espressioni regolari. Per vedere tutte le opzioni

findstr /?

+0

Questo probabilmente non si applica alla tua domanda specifica, ma per la ricerca senza distinzione tra maiuscole/minuscole usa/i findstr/i do_matchcall –

Problemi correlati