2009-09-15 12 views
28

Vorrei migliorare le mie capacità C per essere più competente nel convertire il codice R in C dove ciò sarebbe utile. Quali suggerimenti hanno le persone che mi aiuteranno nel mio cammino?C per programmatori R - risorse/approcci consigliati una volta oltre le nozioni di base

Background: ho seguito un Intro online per C corso di qualche anno fa e che, più scrittura R Estensioni e S Programmazione (Venables & Ripley) mi ha permesso di convertire collo di bottiglia per le operazioni di C, per esempio calcolo del prodotto di sottomatrici (ho reinventato la ruota lì?). Tuttavia mi piacerebbe andare un po 'oltre, ad es. convertire pezzi più grandi di codice, facendo uso di routine di algebra lineare ecc.

Senza dubbio ho più da imparare dalle risorse che ho usato prima, ma mi chiedevo se ci fossero altri che la gente raccomandasse? Lavorare attraverso gli esempi è ovviamente un modo per saperne di più: Brian Ripley ha fornito un paio di esempi di passaggio da prototipi S a S + C in questo workshop su Efficient Programming in S e un più recente laboratorio di bioconduttori Advanced R per Bioinformatica (non è possibile pubblicare post collegamento ipertestuale) include un laboratorio sulla scrittura di un algoritmo R + C. Più simile a questo, o altri suggerimenti sarebbero apprezzati.

risposta

14

Ho lottato con questo problema pure.

Se il problema è quello di migliorare il comando di C, ci sono un sacco di elenchi di libri sull'argomento. Iniziano tutti con K & R. Mi sono divertito con "Expert C Programming" di P. van der Linden e "C primer" di S. Prata. Qualsiasi riferimento alla libreria standard C funziona.

Se il problema è di interfacciare C a R, diverso dal documento R ufficiale sopra menzionato, è possibile controllare questo Harvard course e questo quick start guide. Ho passato solo scalari e array a C, e onestamente non saprei come interfacciare strutture dati complesse.

Se il problema è di interfacciare C++ con R, o di costruire competenze in C++, non posso davvero rispondere dato che non uso molto C++. Un buon punto di partenza per me è stato "C++ the Core Language" (O'Reilly). Molto semplice, primitivo, ma utile per le persone provenienti da C.

+0

Sto selezionando questa risposta perché sembra più pertinente a dove sono ora. Il corso di Harvard sarà utile per rivedere C, presentarmi al C++ (vedere il commento alla risposta di Dirk) ed è incentrato sull'uso di C/C++ in R. –

9

La mia raccomandazione principale è guardare altri pacchetti. Inutile dire che tutti i pacchetti non usano il codice C, quindi dovrai trovare degli esempi. È possibile scaricare il codice sorgente per tutti i pacchetti su CRAN e, in alcuni casi, you can also browse them on R-Forge. Some R projects are also maintained on Google Code o siti come github (for instance, ggplot2). Troverete il codice C nella directory "src".

In generale, pensa a ciò che stai cercando di realizzare, quindi guarda i pacchetti che fanno cose simili.

Il libro "C Programming Language" è probabilmente ancora il più utilizzato, quindi è consigliabile averlo sul bookshelf. Il seguente libro libero è anche una risorsa utile: http://publications.gbdirect.co.uk/c_book/

+0

Ho fatto clic in modo casuale su http: // github.com/pjotrp/rqtl/blob/master/src/fitqtl_hk.c collegamento che fornisci ai principianti. Pensi che usare *** p sia un buon modo per iniziare? R ha dei puntatori –

+0

Beh, ha senso imparare da coloro che hanno seguito un percorso simile (anche se il loro codice potrebbe non essere l'esempio perfetto). Ho una copia di K & R (2nd ed) che era il mio papà - bello sapere che è ancora considerato utile :) –

16

Questa è una domanda molto interessante. Avevo imparato C e C++ prima di passare a R, quindi avrei potuto rendere più facile aggiungere C/C++ a R.

Ma anche con quello, sarei tra i primi a dire che aggiungere C-R pura è estremamente complicato a causa delle diverse macro e R-internals a livello C che devi imparare.

Che mi porta al mio argomento preferito: Utilizzare un livello di astrazione aggiuntivo come il pacchetto Rcpp. Nasconde molti dettagli cattivi. E spero che non sia necessario conoscere molto C++ per farne uso. Un esempio di pacchetto che lo utilizza è il piccolo pacchetto earthmovdist su R-Forge che utilizza le classi di wrapper Rcpp per interfacciare una determinata metrica.

Edit 1: Per esempio, vedere la main function of earthmovdist here che dovrebbe essere auspicabilmente abbastanza facile da leggere, possibilmente con il (breve) Rcpp classi wrapper manuale pacchetto ad proprio fianco.

Edit 2: Tre motivi veloci per cui ritengo C++ per essere più appropriato e R-alike:

  • utilizzando Rcpp classi wrapper significa che non usare e annullare la protezione, che è una frequente fonte di errori e heap corruzione se non mappato

  • utilizzando Rcpp e classi di contenitore STL come vector ecc significa che non si deve chiamare esplicitamente malloc()/free() o new/delete che rimuove un altro frequente fonte di errore.

  • Rcpp permette di avvolgere tutto in try/catch blocchi a livello di C++ e segnala l'eccezione di nuovo a R --- in modo che nessun seg.faults improvvisi e morti di programma.

Detto questo, scelta della lingua è una decisione molto personale, e molti utenti sono ovviamente perfettamente felice con l'interfaccia di livello inferiore tra C e R.

+0

Questo è interessante - non qualcosa che ho considerato. I tuoi argomenti sono abbastanza convincenti, ma non ho mai guardato il C++ prima, quindi prima dovrei fare un po 'di compiti a casa. –

+0

Non ho familiarità con C/C++, ma ho ereditato un pacchetto che usa C, e ho capito che C++ è un po 'retrocompatibile con C - è così? È facile/utile la migrazione di C-> C++ solo per sfruttare Rcpp? – Abe

+0

In prima approssimazione, il C++ è un superset. Quindi puoi sfruttare Rcpp per mantenere i pacchetti basati su C esistenti. –

3

"Qual è il miglior libro per imparare C?" è un perenialSOquestion. (Il collegamento intermedio è probabilmente il migliore.)

Per quanto riguarda le modalità di apprendimento R specifiche per C, ho trovato istruttivo scaricare il codice sorgente R e dare un'occhiata al codice .Internal.

EDIT: Qualcun altro aveva appena chiesto "What to read after K&R?"

0

Se il tuo obiettivo è usare C per eliminare i colli di bottiglia avrai bisogno di una buona libreria numerica in C. Ci sono molti, ma ho trovato gsl (GNU Scientific Library) piuttosto utile.

http://www.gnu.org/software/gsl/

C'è anche il classico libro "ricette numerici in C", che fornisce una panoramica delle più importanti tecniche numeriche (anche se non consiglia di utilizzare il loro codice testualmente).

+0

Non sono sicuro di quanto sia utile nel mio caso. Sto scrivendo il codice per i pacchetti R e penso che usare il codice gsl significherebbe che i miei pacchetti richiederebbero agli utenti di avere gsl sul loro computer? Preferirei solo dipendere dal codice distribuito con R (o disponibile tramite CRAN). Correggimi se mi sto sbagliando! –

Problemi correlati