Usando arquivos de cabeçalho de terceiros com o Rcpp

Eu tenho um arquivo de cabeçalho chamadocoolStuff.h que contém uma funçãoawesomeSauce(arg1) que eu gostaria de usar no meu arquivo de origem do cpp.

Estrutura de Diretórios:

RworkingDirectorysourceCpptheCppFile.cppcppHeaderscoolStuff.h

O código:

#include <Rcpp.h>
#include <cppHeaders/coolStuff.h>
using namespace Rcpp;

// [[Rcpp::export]]
double someFunctionCpp(double someInput){

 double someOutput = awesomeSauce(someInput);

return someOutput;
}

Eu recebo o erro:

 theCppFile.cpp:2:31: error: cppHeaders/coolStuff.h: No such file or directory

Eu mudei o arquivo e diretório em todo o lugar e não consigo fazer isso funcionar. Eu vejo exemplos em todo o lugar de usar cabeçalhos de terceiros que dizem apenas fazer isso:

#include <boost/array.hpp>

(Isso é de Hadley / devtools)

https://github.com/hadley/devtools/wiki/Rcpp

Então, o que dá? Eu tenho procurado durante toda a manhã e não consigo encontrar uma resposta para o que me parece uma coisa simples.

ATUALIZAÇÃO 01.11.12

Ok, agora que eu descobri como construir pacotes que usam Rcpp no ​​Rstudio, deixe-me reformular a questão. Eu tenho um arquivo de cabeçalho stand alone coolStuff.h que contém uma função que eu quero usar no meu código cpp.

1) Onde devo colocar coolStuff.h na estrutura de diretórios do pacote para que a função que ele contém possa ser usada pelo CppFile.cpp?

2) Como faço para chamar coolStuff.h nos arquivos cpp? Obrigado novamente por sua ajuda. Eu aprendi muito com a última conversa.

Nota: Eu li a vinheta "Escrevendo um pacote que usa Rcpp" e não explica como fazer isso.

A resposta:

Ok, deixe-me resumir a resposta à minha pergunta, pois ela está espalhada por toda a página. Se eu tiver um detalhe errado, sinta-se à vontade para editá-lo ou avise-o e eu o editarei:

Então você encontrou um.h ou.cpp arquivo que contém uma função ou algum outro pedaço de código que você deseja usar em um.cpp arquivo que você está escrevendo para usar comRcpp.

Vamos continuar chamando esse código encontradocoolStuff.h e chame a função que você quer usarawesomeSauce(). Vamos chamar o arquivo que você está escrevendotheCppFile.cpp.

(Devo observar aqui que o código em arquivos .h e em arquivos .cpp é todo o código C ++ e a diferença entre eles é que o programador C ++ mantenha as coisas organizadas da maneira correta. Vou deixar uma discussão sobre a diferença aqui , mas uma pesquisa simples aqui no SO irá levá-lo a discutir a diferença. Para você, o programador R precisa usar um pouco de código que você encontrou, não há diferença real.

EM RESUMO: Você pode usar um arquivo comocoolStuff.h desde que ele não ligue para outras bibliotecas, seja cortando e colandotheCppFile.cpp, ou se você criar um pacote, você pode colocar o arquivo no\src diretório com otheCppFile.cpp arquivar e usar#include "coolStuff.h" no topo do arquivo que você está escrevendo. Este último é mais flexível e permite que você use funções emcoolStuff.h em outro.cpp arquivos.

DETALHES:

1)coolStuff.h não deve chamar outras bibliotecas. Isso significa que não pode ter nenhuma instrução include no topo. Em caso afirmativo, o que detalho a seguir provavelmente não funcionará, e o uso do código encontrado que chama outras bibliotecas está além do escopo desta resposta.

2) Se você quiser compilar o arquivo comsourceCpp() você precisa cortar e colarcoolStuff.h para dentrotheCppFile.cpp. Me disseram que há exceções, massourceCpp() é projetado para compilar um.cpp arquivo, de modo que é o melhor caminho a tomar.

(NOTA: não garanto que um simples recortar e colar funcionem imediatamente. Talvez seja necessário renomear as variáveis ​​ou, mais provavelmente, alternar os tipos de dados usados ​​para serem consistentes com os que você está usando.theCppFile.cpp. Mas até agora, recortar e colar funcionou com o mínimo de problemas para mim com 6 diferentes simples.h arquivos)

3) Se você só precisa usar o código decoolStuff.h emtheCppFile.cpp e em nenhum outro lugar, então você deve cortar e colá-lotheCppFile.cpp.

(Novamente eu não faço garantias ver a nota acima sobre recortar e colar)

4) Se você quiser usar o código contidocoolStuff.h emtheCppFile.cpp E outro.cpp arquivos, você precisa olhar para construir um pacote. Isso não é difícil, mas pode ser um pouco complicado, porque as informações sobre a criação de pacotes com Rcpp vão desde a exaustiva documentação completa que você quer com qualquer pacote R (mas que está acima de sua cabeça como um novato), e o novato sensível introduções (que podem deixar de fora um detalhevocê acontecer de precisar).

Aqui está o que eu sugiro:

A) Primeiro, obtenha uma versão dotheCppFile.cpp com o código decoolStuff.h recortar e colar emtheCppFile.cpp que compila comsourceCpp() e funciona como você espera. Isso não é obrigatório, mas se você é novo nos pacotes Rcpp OR, é bom garantir que seu código funcione nessa situação simples antes de passar para o caso mais complicado abaixo.

B) Agora, construa seu pacote usandoRcpp.package.skeleton() ou use a funcionalidade Build no RStudio (ALTAMENTE recomendado). Você pode encontrar detalhes sobre o usoRcpp.package.skeleton() emhadley / devtools ouVinheta de atributos Rcpp. A documentação completa para escrever pacotes com o Rcpp está noEscrevendo um pacote que usa o Rcpp, no entanto, este pressupõe que você conhece bem o seu caminho em torno do C ++, e não usa o novo modo "Atributos" de fazer o Rcpp.

Não se esqueça de "Build & Reload" se usar o RStudio oucompileAttributes() se você não estiver no RStudio.

C) Agora você deve ver no seu diretório \ R um arquivo chamadoRcppExports.R. Abra e confira. EmRcppExports.R você deve ver as funções de wrapper R para todos os arquivos .cpp que você tem em seu\src diretório. Muito doce.

D) Experimente a função R que corresponde à função que você escreveu emtheCppFile.cpp. Funciona? Se assim for, siga em frente.

E) Com o seu pacote construído você pode movercoolStuff.h nosrc pasta comtheCppFile.cpp.

F) Agora você pode remover o código de recortar e colar detheCppFile.cpp e no topo datheCppFile.cpp (e qualquer outro arquivo .cpp que você queira usar o código de coolStuff.h) coloque#include "coolStuff.h" logo após#include <Rcpp.h>. Observe que não há colchetes ao redor de ranker.h, mas sim "". Esta é uma convenção de C ++ ao incluir arquivos locais fornecidos pelo usuário em vez de um arquivo de biblioteca como Rcpp ou STL etc ...

G) Agora você tem que reconstruir o pacote. No RStudio isso é apenas "Build & Reload" no menu Build. Se você não está usando o RStudio, você deve executarcompileAttributes()

H) Agora tente a função R novamente, assim como você fez na etapa D), esperamos que funcione.

questionAnswers(7)

yourAnswerToTheQuestion