Verwenden von Header-Dateien von Drittanbietern mit Rcpp
Ich habe eine Header-Datei namenscoolStuff.h
das enthält eine FunktionawesomeSauce(arg1)
das möchte ich in meiner cpp quelldatei verwenden.
Verzeichnisaufbau:
RworkingDirectorysourceCpptheCppFile.cppcppHeaderscoolStuff.hDer Code:
#include <Rcpp.h>
#include <cppHeaders/coolStuff.h>
using namespace Rcpp;
// [[Rcpp::export]]
double someFunctionCpp(double someInput){
double someOutput = awesomeSauce(someInput);
return someOutput;
}
Ich erhalte den Fehler:
theCppFile.cpp:2:31: error: cppHeaders/coolStuff.h: No such file or directory
Ich habe die Datei und das Verzeichnis überall hin verschoben und kann nicht scheinen, dies zum Laufen zu bringen. Ich sehe überall Beispiele für die Verwendung von Kopfzeilen von Drittanbietern, die folgendes sagen:
#include <boost/array.hpp>
(Das ist von Hadley / devtools)
https://github.com/hadley/devtools/wiki/Rcpp
Also was gibt es? Ich habe den ganzen Morgen gesucht und kann keine Antwort auf das finden, was mir einfach vorkommt.
UPDATE 01.11.12Ok, jetzt, da ich herausgefunden habe, wie man Pakete erstellt, die Rcpp in Rstudio verwenden, lasse ich die Frage umformulieren. Ich habe eine eigenständige Header-Datei coolStuff.h, die eine Funktion enthält, die ich in meinem CPP-Code verwenden möchte.
1) Wo soll ich coolStuff.h in die Paketverzeichnisstruktur einfügen, damit die darin enthaltene Funktion von theCppFile.cpp verwendet werden kann?
2) Wie rufe ich coolStuff.h in den CPP-Dateien auf? Danke nochmal für deine Hilfe. Ich habe viel aus dem letzten Gespräch gelernt.
Hinweis: Ich habe die Vignette "Schreiben eines Pakets, das Rcpp verwendet" gelesen und es wird nicht erklärt, wie dies getan wird.
Die Antwort:Ok, lassen Sie mich die Antwort auf meine Frage zusammenfassen, da sie auf dieser Seite verteilt ist. Wenn ich ein falsches Detail erhalte, kann ich es gerne bearbeiten oder mich informieren und ich werde es bearbeiten:
Sie haben also eine gefunden.h
oder.cpp
Datei, die eine Funktion oder ein anderes Codebit enthält, das Sie in a verwenden möchten.cpp
Datei, mit der Sie schreiben möchtenRcpp
.
Nennen wir diesen gefundenen Code weitercoolStuff.h
und rufen Sie die gewünschte Funktion aufawesomeSauce()
. Rufen wir die Datei auf, die Sie schreibentheCppFile.cpp
.
(Ich sollte hier beachten, dass der Code in .h-Dateien und in .cpp-Dateien ausschließlich C ++ - Code ist und der Unterschied zwischen ihnen darin besteht, dass der C ++ - Programmierer die Dinge auf die richtige Weise organisiert. Ich werde eine Diskussion über den Unterschied hier draußen lassen , aber eine einfache Suche hier auf SO führt Sie zur Diskussion des Unterschieds. Für Sie als R-Programmierer, der ein bisschen Code verwenden muss, den Sie gefunden haben, gibt es keinen wirklichen Unterschied.)
ZUSAMENFASSEND: Sie können eine Datei wiecoolStuff.h
vorausgesetzt, es ruft keine anderen Bibliotheken auf, weder durch Ausschneiden noch durch EinfügentheCppFile.cpp
, oder wenn Sie ein Paket erstellen, können Sie die Datei im\src
Verzeichnis mit dertheCppFile.cpp
Datei und verwenden#include "coolStuff.h"
Oben in der Datei, die Sie schreiben. Letzteres ist flexibler und ermöglicht die Verwendung von Funktionen incoolStuff.h
in anderen.cpp
Dateien.
EINZELHEITEN:
1)coolStuff.h
darf keine anderen Bibliotheken aufrufen. Das bedeutet, dass es oben keine include-Anweisungen geben kann. Wenn dies der Fall ist, wird das, worauf ich unten näher eingehen werde, wahrscheinlich nicht funktionieren, und die Verwendung von gefundenem Code, der andere Bibliotheken aufruft, würde den Rahmen dieser Antwort sprengen.
2) Wenn Sie die Datei mit kompilieren möchtensourceCpp()
Sie müssen ausschneiden und einfügencoolStuff.h
intheCppFile.cpp
. Mir wurde gesagt, dass es Ausnahmen gibt, abersourceCpp()
ist entworfen, um eine zu kompilieren.cpp
Datei, so ist das der beste Weg zu nehmen.
(HINWEIS: Ich kann nicht garantieren, dass ein einfaches Ausschneiden und Einfügen sofort funktioniert. Möglicherweise müssen Sie Variablen umbenennen oder die verwendeten Datentypen mit größerer Wahrscheinlichkeit so ändern, dass sie mit denen übereinstimmen, in denen Sie sie verwendentheCppFile.cpp
. Aber bisher hat das Ausschneiden und Einfügen mit minimalem Aufwand für mich mit 6 verschiedenen einfachen gearbeitet.h
Dateien)
3) Wenn Sie nur Code von verwenden müssencoolStuff.h
imtheCppFile.cpp
und nirgendwo sonst solltest du es ausschneiden und einfügentheCppFile.cpp
.
(Auch hier übernehme ich keine Garantie, siehe Hinweis zum Ausschneiden und Einfügen)
4) Wenn Sie den in enthaltenen Code verwenden möchtencoolStuff.h
imtheCppFile.cpp
Und andere.cpp
Dateien, müssen Sie in die Erstellung eines Pakets schauen. Dies ist nicht schwer, kann aber ein bisschen knifflig sein, da die Informationen zum Erstellen von Paketen mit Rcpp von der ausführlichen Dokumentation abhängen, die Sie mit jedem R-Paket (das ist aber für Anfänger über Ihrem Kopf) und dem Neuling-sensitiv wünschen Einführungen (die ein Detail auslassen können)Sie zufällig brauchen).
Folgendes schlage ich vor:
A) Holen Sie sich zuerst eine Version vontheCppFile.cpp
mit dem Code voncoolStuff.h
Ausschneiden und Einfügen intheCppFile.cpp
das kompiliert mitsourceCpp()
und funktioniert so, wie Sie es erwarten. Dies ist kein Muss, aber wenn Sie Rcpp OR-Pakete noch nicht kennen, sollten Sie sicherstellen, dass Ihr Code in dieser einfachen Situation funktioniert, bevor Sie mit dem weiter unten beschriebenen, komplizierteren Fall fortfahren.
B) Bauen Sie nun Ihr Paket mitRcpp.package.skeleton()
oder verwenden Sie die Build-Funktion in RStudio (dringend empfohlen). Details zur Verwendung finden Sie hierRcpp.package.skeleton()
imhadley / devtools oderRcpp Attributes Vignette. Die vollständige Dokumentation zum Schreiben von Paketen mit Rcpp finden Sie in derSchreiben eines Pakets, das Rcpp verwendetIn diesem Beispiel wird jedoch davon ausgegangen, dass Sie sich in C ++ recht gut auskennen und nicht die neuen "Attributes" -Methoden für Rcpp verwenden.
Vergessen Sie nicht "Build & Reload", wenn Sie RStudio oder verwendencompileAttributes()
wenn Sie nicht in RStudio sind.
C) Nun sollten Sie in Ihrem \ R-Verzeichnis eine Datei mit dem Namen sehenRcppExports.R
. Öffne es und überprüfe es. ImRcppExports.R
Sie sollten die R-Wrapper-Funktionen für alle CPP-Dateien sehen, die Sie in Ihrem haben\src
Verzeichnis. Sehr süß.
D) Probieren Sie die R-Funktion aus, die der Funktion entspricht, in die Sie geschrieben habentheCppFile.cpp
. Funktioniert es? Wenn ja, fahren Sie fort.
E) Mit Ihrem Paket können Sie sich bewegencoolStuff.h
in diesrc
Ordner mittheCppFile.cpp
.
F) Jetzt können Sie den Code zum Ausschneiden und Einfügen von entfernentheCppFile.cpp
und oben auftheCppFile.cpp
(und jede andere CPP-Datei, die Sie Code aus coolStuff.h verwenden möchten) setzen#include "coolStuff.h"
kurz nachdem#include <Rcpp.h>
. Beachten Sie, dass Ranker.h nicht in eckige Klammern eingeschlossen ist, sondern "". Dies ist eine C ++ - Konvention, wenn vom Benutzer bereitgestellte lokale Dateien anstelle von Bibliotheksdateien wie Rcpp oder STL usw. einbezogen werden.
G) Jetzt müssen Sie das Paket neu erstellen. In RStudio ist dies nur "Build & Reload" im Menü "Build". Wenn Sie RStudio nicht verwenden, sollten Sie ausführencompileAttributes()
H) Versuchen Sie nun die R-Funktion erneut, wie Sie es in Schritt D) getan haben, hoffentlich funktioniert es.