2009-09-15 3 views
28

Me gustaría mejorar mis habilidades C para ser más competente al convertir el código R en C, cuando sea útil. ¿Qué consejos tiene la gente que me ayudarán en mi camino?C para programadores R: recursos/enfoques recomendados una vez que pasaron los fundamentos

Antecedentes: Me siguió una Introducción en línea a C Hace curso de pocos años y que además escritura R Extensiones y S Programación (Venables & Ripley) me permitió convertir cuello de botella operaciones de C, por ejemplo, computar el producto de submatrices (¿reinventé la rueda allí?). Sin embargo, me gustaría ir un poco más allá de esto, p. convirtiendo trozos de código más grandes, haciendo uso de rutinas de álgebra lineal, etc.

Sin duda, tengo mucho que aprender de los recursos que utilicé anteriormente, pero me preguntaba si había otros que la gente recomendara. Trabajar con ejemplos es obviamente una forma de obtener más información: Brian Ripley dio un par de ejemplos de cómo pasar de prototipos S a S + C en este taller en Efficient Programming in S y un taller de Bioconductor más reciente Advanced R para Bioinformática (lo siento, no se puede publicar hipervínculo) incluye un laboratorio sobre cómo escribir un algoritmo de R + C. Más como esto, u otras sugerencias serían apreciadas.

Respuesta

14

he luchado con este problema también.

Si el problema es mejorar el comando de C, hay muchas listas de libros sobre el tema. Todos comienzan con K & R. Disfruté de "Expert C Programming" de P. van der Linden y "C primer" de S. Prata. Cualquier referencia en la biblioteca estándar C funciona.

Si el problema es la interfaz C a R, a excepción del documento oficial R ya mencionado, puede consultar este Harvard course, y este quick start guide. Solo le he pasado escalares y matrices a C, y honestamente no sabría cómo interconectar estructuras de datos complejas.

Si el problema es la interfaz de C++ a R, o las habilidades de compilación en C++, no puedo responder porque no uso mucho C++. Un buen punto de partida para mí fue "C++, el lenguaje principal" (O'Reilly). Muy simple, primitivo, pero útil para personas que vienen de C.

+0

Estoy seleccionando esta respuesta ya que me parece más relevante que ahora. El curso de Harvard será útil para revisar C, presentarme a C++ (ver comentario a la respuesta de Dirk) y centrarme en usar C/C++ en R. –

9

Mi recomendación principal es mirar otros paquetes. Huelga decir que todos los paquetes no usan código C, por lo que deberá encontrar ejemplos que sí lo hagan. Puede descargar el código fuente de todos los paquetes fuera de CRAN y, en algunos casos, you can also browse them on R-Forge. Some R projects are also maintained on Google Code o sitios como github (for instance, ggplot2). Encontrará el código C en el directorio "src".

En general, piense en lo que está tratando de lograr y luego observe los paquetes que hacen cosas similares.

El libro "C Programming Language" es probablemente el más utilizado, por lo que es posible que desee tenerlo en su estantería. El siguiente libro gratuito también es un recurso útil: http://publications.gbdirect.co.uk/c_book/

+0

Acabo de hacer clic aleatoriamente http: // github.com/pjotrp/rqtl/blob/master/src/fitqtl_hk.c enlace que proporciona al novato. ¿Crees que usar *** p es una buena forma de comenzar? ¿Tiene R punteros? –

+0

Bueno, tiene sentido aprender de aquellos que han recorrido un camino similar (incluso si su código puede no ser el ejemplo perfecto). Tengo una copia de K & R (2nd ed) que solía ser de mi papá, es bueno saber que todavía se considera útil :) –

16

Esa es una pregunta muy interesante. Da la casualidad, aprendí C y C++ antes de moverme a R, así que puede haber hecho que sea "más fácil" para mí agregar C/C++ a R.

Pero incluso con eso, estaría entre los primeros en decir que agregar C a R puro es extremadamente complicado debido a las diferentes macros y R-internas en el nivel C que necesitas aprender.

Lo que me lleva a mi argumento favorito: Use una capa de abstracción adicional como el paquete Rcpp. Oculta muchos de los detalles desagradables. Y espero que no necesite saber mucho sobre C++ para poder usarlo. Un ejemplo de un paquete que lo usa es el pequeño paquete earthmovdist en R-Forge que usa Rcpp clases de contenedor para interconectar una métrica en particular.

Edición 1: Por ejemplo, ver la main function of earthmovdist here que esperemos que sea lo suficientemente fácil de leer, posiblemente con la (cortas) Rcpp clases de envoltura manual de paquete en el lado de uno.

Edición 2: Tres razones rápidas por lo que considero C++ sea más apropiado y R-por igual:

  • usando Rcpp clases de envoltura significa que nunca tiene que utilizar proteger y DESPROTEGER, que es una fuente frecuente de error y heap corrupción si no se ha mapeado

  • usando Rcpp y con clases de contenedores STL como vector etc. significa que nunca tiene que llamar explícitamente al malloc()/free() o new/delete, lo que elimina otra fuente frecuente de error.

  • Rcpp le permite envolver todo en try/catch bloques en el nivel C++ y los informes de excepción de nuevo a R --- por lo que no seg.faults repentinos y las muertes de los programas.

Dicho esto, la elección del idioma es una decisión muy personal, y muchos usuarios son, por supuesto, muy feliz con la interfaz de nivel inferior entre C y R.

+0

Esto es interesante, no es algo que haya considerado. Sus argumentos son bastante convincentes, pero no he visto C++ antes, así que primero tendría que hacer un poco de tarea. –

+0

No estoy familiarizado con C/C++, pero heredé un paquete que usa C, y me doy cuenta de que C++ es algo compatible con C: ¿es así? ¿Es fácil/vale la pena migrar C-> C++ solo para aprovechar Rcpp? – Abe

+0

En una primera aproximación, C++ es un superconjunto. De modo que puede aprovechar Rcpp para mantener los paquetes existentes basados ​​en C. –

3

"¿Cuál es el mejor libro para aprender ¿DO?" es un perenialSOquestion. (El enlace del medio es probablemente el mejor.)

En cuanto a las formas de aprendizaje específicas de R C, me ha parecido instructivo descargar el código fuente R y echar un vistazo al código interno.

EDIT: Otra persona simplemente había pedido "What to read after K&R?"

0

Si su objetivo es usar C para deshacerse de los cuellos de botella, necesitará una buena biblioteca numérica en C. Hay muchos, pero he encontrado gsl (Biblioteca Científica GNU) bastante útil.

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

También está el libro clásico "recetas numéricas en C", que ofrece una visión general de las técnicas numéricas importantes (aunque no recomiendo el uso de su código textual).

+0

No estoy seguro de cuán útil es esto en mi caso. Estoy escribiendo código para paquetes R y creo que usar código gsl significaría que mis paquetes requerirían que los usuarios tengan gsl en su computadora. Prefiero solo depender del código distribuido con R (o disponible a través de CRAN). ¡Corrígeme si me estoy equivocando! –

Cuestiones relacionadas