Używanie plików nagłówkowych innych firm z Rcpp

Mam plik nagłówkowy o nazwiecoolStuff.h który zawiera funkcjęawesomeSauce(arg1) które chciałbym użyć w moim pliku źródłowym cpp.

Struktura katalogów:

RworkingDirectoryźródłoCpptheCppFile.cppcppHeaderscoolStuff.h

Kod:

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

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

 double someOutput = awesomeSauce(someInput);

return someOutput;
}

Dostaję błąd:

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

Przeniosłem plik i katalog wszędzie i nie wydaje mi się, żeby to działało. Widzę przykłady wszędzie, gdzie używam nagłówków firm trzecich, które mówią po prostu:

#include <boost/array.hpp>

(Thats from Hadley / devtools)

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

Więc co daje? Szukałem przez cały ranek i nie mogę znaleźć odpowiedzi na to, co wydaje mi się proste.

AKTUALIZACJA 01.11.12

Ok, teraz, gdy odkryłem, jak budować pakiety, które używają Rcpp, w Rstudio pozwól mi przeformułować pytanie. Mam samodzielny plik nagłówkowy coolStuff.h zawierający funkcję, której chcę użyć w moim kodzie cpp.

1) Gdzie należy umieścić coolStuff.h w strukturze katalogów pakietów, aby funkcja, którą zawiera, mogła być użyta przez theCppFile.cpp?

2) Jak zadzwonić do coolStuff.h w plikach cpp? Jeszcze raz dziękuję za pomoc. Wiele nauczyłem się z ostatniej rozmowy.

Uwaga: Przeczytałem winietę „Pisanie pakietu, który używa Rcpp” i nie wyjaśnia, jak to zrobić.

Odpowiedź:

Ok, pozwól mi podsumować odpowiedź na moje pytanie, ponieważ jest rozproszona na tej stronie. Jeśli dostanę jakiś błąd, możesz go edytować lub powiadomić mnie, a ja go edytuję:

Więc znalazłeś.h lub.cpp plik zawierający funkcję lub inny fragment kodu, którego chcesz użyć w a.cpp plik, którego używasz do pisaniaRcpp.

Pozwala nazywać ten znaleziony kodcoolStuff.h i wywołaj funkcję, której chcesz użyćawesomeSauce(). Pozwala nazwać plik, który piszesztheCppFile.cpp.

(Powinienem tutaj zauważyć, że kod w plikach .h i w plikach .cpp jest kodem C ++, a różnica między nimi polega na tym, aby programista C ++ utrzymywał porządek we właściwy sposób. Pozostawiam tutaj dyskusję na temat różnicy , ale proste wyszukiwanie tutaj na SO doprowadzi cię do omówienia różnicy. Dla ciebie programista R, który potrzebuje użyć kodu, który znalazłeś, nie ma realnej różnicy.)

W SKRÓCIE: Możesz użyć pliku takiego jakcoolStuff.h pod warunkiem, że nie wywołuje żadnych innych bibliotek, poprzez wklejenie i wklejenietheCppFile.cpplub jeśli utworzysz pakiet, możesz umieścić plik w pliku\src katalog ztheCppFile.cpp plik i użyj#include "coolStuff.h" na górze zapisywanego pliku. Ten ostatni jest bardziej elastyczny i pozwala na korzystanie z funkcji wcoolStuff.h w innych.cpp pliki.

DETALE:

1)coolStuff.h nie wolno dzwonić do innych bibliotek. Oznacza to, że nie może mieć żadnych załączonych instrukcji na górze. Jeśli tak, to, co szczegółowo poniżej, prawdopodobnie nie zadziała, a użycie znalezionego kodu, który wywołuje inne biblioteki, wykracza poza zakres tej odpowiedzi.

2) Jeśli chcesz skompilować plik za pomocąsourceCpp() musisz wyciąć i wkleićcoolStuff.h wtheCppFile.cpp. Powiedziano mi, że są wyjątki, alesourceCpp() jest przeznaczony do kompilacji.cpp plik, więc to najlepsza droga do podjęcia.

(UWAGA: Nie gwarantuję, że proste wycinanie i wklejanie będzie działało po wyjęciu z pudełka. Być może będziesz musiał zmienić nazwy zmiennych lub, co bardziej prawdopodobne, przełączyć typy danych używane w celu zachowania spójności z tymi, których używasz wtheCppFile.cpp. Ale jak dotąd, wycinanie i wklejanie działało z minimalnym zamieszaniem dla mnie z 6 różnymi prostymi.h pliki)

3) Jeśli potrzebujesz tylko użyć kodu zcoolStuff.h wtheCppFile.cpp i nigdzie indziej nie powinieneś go przecinać i wklejaćtheCppFile.cpp.

(Ponownie nie udzielam żadnych gwarancji, patrz uwaga powyżej o wycinaniu i wklejaniu)

4) Jeśli chcesz użyć kodu zawartego wcoolStuff.h wtheCppFile.cpp I inne.cpp plików, musisz zajrzeć do budowania pakietu. To nie jest trudne, ale może być trochę skomplikowane, ponieważ informacje o budowaniu pakietów z Rcpp wahają się od wyczerpującej szczegółowej dokumentacji, którą chcesz z dowolnym pakietem R (ale to jest ponad twoją głową jako nowicjusz), a newbie wrażliwym wprowadzenia (które mogą pomijać szczegóły)ty zdarzyć się potrzeba).

Oto, co proponuję:

A) Najpierw pobierz wersjętheCppFile.cpp z kodem zcoolStuff.h wyciąć i wkleić dotheCppFile.cpp który się kompilujesourceCpp() i działa tak, jak tego oczekujesz. Nie jest to konieczne, ale jeśli jesteś nowy w pakietach Rcpp OR, miło jest upewnić się, że twój kod działa w tej prostej sytuacji, zanim przejdziesz do bardziej skomplikowanego przypadku poniżej.

B) Teraz zbuduj swój pakiet używającRcpp.package.skeleton() lub użyj funkcji budowania w RStudio (zalecane WYSOKIE). Możesz znaleźć szczegóły dotyczące korzystaniaRcpp.package.skeleton() whadley / devtools lubAtrybuty Rcpp Winieta. Pełna dokumentacja do pisania pakietów z Rcpp znajduje się wPisanie pakietu korzystającego z Rcpp, jednak ten zakłada, że ​​dobrze znasz C ++ i nie używa nowego sposobu „Atrybuty” do rcpp.

Nie zapomnij o „Build & Reload”, jeśli używasz RStudio lubcompileAttributes() jeśli nie jesteś w RStudio.

C) Teraz powinieneś zobaczyć w swoim katalogu R plik o nazwieRcppExports.R. Otwórz i sprawdź. WRcppExports.R Powinieneś zobaczyć funkcje wrappera R dla wszystkich plików .cpp, które masz w swoim\src informator. Całkiem słodki.

D) Wypróbuj funkcję R, która odpowiada funkcji, w której napisałeśtheCppFile.cpp. Czy to działa? Jeśli tak, przejdź dalej.

E) Z budowanym pakietem możesz się poruszaćcoolStuff.h wsrc folder ztheCppFile.cpp.

F) Teraz możesz usunąć kod wycinania i wklejaniatheCppFile.cpp i na górzetheCppFile.cpp (i dowolny inny plik .cpp, którego chcesz użyć z kodu z coolStuff.h)#include "coolStuff.h" zaraz po#include <Rcpp.h>. Zauważ, że nie ma nawiasów wokół rankera.h, raczej są „”. Jest to konwencja C ++, gdy zawiera lokalne pliki dostarczone przez użytkownika, a nie plik biblioteki, taki jak Rcpp lub STL itp ...

G) Teraz musisz odbudować pakiet. W RStudio jest to po prostu „Build & Reload” w menu Build. Jeśli nie używasz RStudio, powinieneś uruchomićcompileAttributes()

H) Teraz spróbuj ponownie użyć funkcji R, tak jak w kroku D), mam nadzieję, że to zadziała.

questionAnswers(7)

yourAnswerToTheQuestion