Usando archivos de encabezado de terceros con Rcpp
Tengo un archivo de encabezado llamadocoolStuff.h
que contiene una funciónawesomeSauce(arg1)
que me gustaría usar en mi archivo fuente cpp.
Estructura de directorios:
RworkingDirectorysourceCpptheCppFile.cppcppHeaderscoolStuff.hEl código:
#include <Rcpp.h>
#include <cppHeaders/coolStuff.h>
using namespace Rcpp;
// [[Rcpp::export]]
double someFunctionCpp(double someInput){
double someOutput = awesomeSauce(someInput);
return someOutput;
}
Me sale el error:
theCppFile.cpp:2:31: error: cppHeaders/coolStuff.h: No such file or directory
He movido el archivo y el directorio por todos lados y parece que no puedo hacer que esto funcione. Veo ejemplos en todo el lugar de usar encabezados de terceros que dicen simplemente hacer esto:
#include <boost/array.hpp>
(Eso es de Hadley / devtools)
https://github.com/hadley/devtools/wiki/Rcpp
Entonces, ¿qué da? He estado buscando toda la mañana y no puedo encontrar una respuesta a lo que me parece una cosa simple.
ACTUALIZACIÓN 01.11.12Ok, ahora que he descubierto cómo construir paquetes que usen Rcpp en Rstudio, permítanme reformular la pregunta. Tengo un archivo de encabezado independiente coolStuff.h que contiene una función que quiero usar en mi código cpp.
1) ¿Dónde debo colocar coolStuff.h en la estructura del directorio del paquete para que la función que contiene pueda ser utilizada por theCppFile.cpp?
2) ¿Cómo llamo a coolStuff.h en los archivos cpp? De nuevo, gracias por tu ayuda. Aprendí mucho de la última conversación.
Nota: Leí la viñeta "Escribiendo un paquete que usa Rcpp" y no explica cómo hacerlo.
La respuesta:Ok, déjame resumir la respuesta a mi pregunta ya que está dispersa en esta página. Si me equivoco al detalle, siéntase libre de editarlo o avisarme y lo editaré:
Así que encontraste un.h
o.cpp
archivo que contiene una función o algún otro bit de código que desea utilizar en una.cpp
archivo que está escribiendo para usar conRcpp
.
Vamos a seguir llamando a este código encontrado.coolStuff.h
y llama a la función que quieras usarawesomeSauce()
. Permite llamar al archivo que estás escribiendo.theCppFile.cpp
.
(Debo notar aquí que el código en los archivos .h y en los archivos .cpp es todo el código C ++ y la diferencia entre ellos es que el programador de C ++ mantenga las cosas organizadas de la manera correcta. Dejaré una discusión de la diferencia aquí. , pero una simple búsqueda aquí en SO le llevará a discutir la diferencia. Para usted, el programador R que necesita usar un poco el código que encontró, no hay una diferencia real.)
EN BREVE: Puedes usar un archivo comocoolStuff.h
siempre que no llame a otras bibliotecas, ya sea cortando y pegando entheCppFile.cpp
, o si creas un paquete puedes colocar el archivo en el\src
directorio con eltheCppFile.cpp
archivar y usar#include "coolStuff.h"
en la parte superior del archivo que está escribiendo. Este último es más flexible y le permite utilizar funciones encoolStuff.h
en otra.cpp
archivos.
DETALLES:
1)coolStuff.h
No debe llamar a otras bibliotecas. Eso significa que no puede tener ninguna declaración de inclusión en la parte superior. Si lo hace, lo que detallo a continuación probablemente no funcionará, y el uso del código encontrado que llama a otras bibliotecas está fuera del alcance de esta respuesta.
2) Si quieres compilar el archivo consourceCpp()
necesitas cortar y pegarcoolStuff.h
dentrotheCppFile.cpp
. Me dicen que hay excepciones, perosourceCpp()
está diseñado para compilar uno.cpp
archivo, así que esa es la mejor ruta a tomar.
(NOTA: No garantizo que un simple corte y pegado funcionará de forma inmediata. Es posible que tenga que cambiar el nombre de las variables, o es más probable que cambie los tipos de datos que se utilizan para que sean coherentes con los que usa entheCppFile.cpp
. Pero hasta ahora, cortar y pegar ha funcionado con un mínimo esfuerzo para mí con 6 diferentes diferentes.h
archivos)
3) Si solo necesitas usar el código decoolStuff.h
entheCppFile.cpp
y en ninguna otra parte, entonces debes cortarlo y pegarlo entheCppFile.cpp
.
(De nuevo, no garantizo que vea la nota anterior sobre cortar y pegar)
4) Si desea utilizar el código contenido encoolStuff.h
entheCppFile.cpp
Y otra.cpp
archivos, usted necesita mirar en la construcción de un paquete. Esto no es difícil, pero puede ser un poco complicado, ya que la información sobre la creación de paquetes con Rcpp va desde la exhaustiva documentación que se desea con cualquier paquete de R (pero esa es la clave para un principiante), y para el novato sensible. introducciones (que pueden dejar de lado un detalle).tú sucede que necesita).
Esto es lo que sugiero:
A) Primero obtén una versión detheCppFile.cpp
con el código decoolStuff.h
cortar y pegar entheCppFile.cpp
que compila consourceCpp()
y funciona como esperas que lo haga. Esto no es una obligación, pero si es nuevo en los paquetes Rcpp OR, es bueno asegurarse de que su código funcione en esta simple situación antes de pasar al caso más complicado a continuación.
B) Ahora construye tu paquete usandoRcpp.package.skeleton()
o use la funcionalidad de compilación en RStudio (muy recomendable). Puede encontrar detalles sobre el uso deRcpp.package.skeleton()
enhadley / devtools oAtributos de Rcpp Viñeta. La documentación completa para escribir paquetes con Rcpp está en elEscribiendo un paquete que usa RcppSin embargo, este supone que conoces bastante bien C ++, y no usa la nueva forma de "atributos" de Rcpp.
No olvide "Construir y recargar" si usa RStudio ocompileAttributes()
Si no estás en RStudio.
C) Ahora debería ver en su directorio \ R un archivo llamadoRcppExports.R
. Ábrelo y échale un vistazo. EnRcppExports.R
debería ver las funciones de envoltorio R para todos los archivos .cpp que tiene en su\src
directorio. Muy dulce.
D) Prueba la función R que corresponde a la función que escribiste entheCppFile.cpp
. ¿Funciona? Si es así, sigue adelante.
E) Con tu paquete construido puedes moverte.coolStuff.h
en elsrc
carpeta contheCppFile.cpp
.
F) Ahora puede eliminar el código de cortar y pegar detheCppFile.cpp
y en la parte superior detheCppFile.cpp
(y cualquier otro archivo .cpp que desee usar código de coolStuff.h) ponga#include "coolStuff.h"
justo después de#include <Rcpp.h>
. Tenga en cuenta que no hay corchetes alrededor de ranker.h, sino que hay "". Esta es una convención de C ++ cuando se incluyen archivos locales proporcionados por el usuario en lugar de un archivo de biblioteca como Rcpp o STL, etc.
G) Ahora tienes que reconstruir el paquete. En RStudio esto es solo "Crear y recargar" en el menú Generar. Si no está utilizando RStudio debería ejecutarcompileAttributes()
H) Ahora intente la función R nuevamente como lo hizo en el paso D), ojalá funcione.