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.hKod:
#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.12Ok, 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.cpp
lub 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.