Ich habe mich durch Rcpp
Dirk Eddelbuettel Tutorial hier gearbeitet:Ausführen kompiliert C++ Code mit RCPP
http://www.rinfinance.com/agenda/
ich gelernt habe, wie eine C++ Datei in einem Verzeichnis zu speichern und nennen es und führen Sie es aus innerhalb R. Die C++ Datei heißt ich bin mit ‚logabs2.ccp‘ und ihr Inhalt sind direkt die von einem von Dirk Dias:
#include <Rcpp.h>
using namespace Rcpp;
inline double f(double x) { return ::log(::fabs(x)); }
// [[Rcpp::export]]
std::vector<double> logabs2(std::vector<double> x) {
std::transform(x.begin(), x.end(), x.begin(), f);
return x;
}
ich betreibe es mit diesem R-Code:
library(Rcpp)
sourceCpp("c:/users/mmiller21/simple r programs/logabs2.cpp")
logabs2(seq(-5, 5, by=2))
# [1] 1.609438 1.098612 0.000000 0.000000 1.098612 1.609438
Ich führe den Code auf einem Windows 7-Rechner aus der R GUI, die standardmäßig zu installieren scheint. Ich habe auch die neueste Version von Rtools
installiert. Der obige R-Code scheint relativ lange zu benötigen. Ich vermute, dass die meiste Zeit dem Kompilieren des C++ - Codes gewidmet ist und dass, sobald der C++ - Code kompiliert wurde, er sehr schnell läuft. Microbenchmark
schlägt sicherlich vor, dass Rcpp
Rechenzeit reduziert.
Ich habe noch nie C++ verwendet, aber ich weiß, dass ich beim Kompilieren von C-Code eine * .exe-Datei bekomme. Ich habe meine Festplatte aus einer Datei namens logabs2.exe
gesucht, kann aber keine finden. Ich frage mich, ob der obige C++ - Code noch schneller ausgeführt werden könnte, wenn eine logabs2.exe
Datei erstellt wurde. Ist es möglich, eine logabs2.exe
Datei zu erstellen und sie irgendwo in einem Ordner zu speichern und dann Rcpp diese Datei aufrufen zu lassen, wann immer ich sie benutzen wollte? Ich weiß nicht, ob das Sinn macht. Wenn ich eine C++ - Funktion in einer * .exe-Datei speichern könnte, müsste ich die Funktion vielleicht nicht jedes Mal kompilieren, wenn ich sie mit Rcpp verwenden wollte, und dann wäre der Rcpp-Code vielleicht noch schneller.
Entschuldigung, wenn diese Frage keinen Sinn ergibt oder ein Duplikat ist. Wenn es möglich ist, die C++ - Funktion als eine * .exe-Datei zu speichern, hoffe ich, dass jemand mir zeigt, wie ich meinen obigen R-Code modifiziere, um ihn auszuführen. Vielen Dank für Ihre Hilfe oder dafür, dass Sie mir klar gemacht haben, warum das, was ich Ihnen vorschlage, nicht möglich oder empfehlenswert ist.
Ich freue mich darauf, Dirks neues Buch zu sehen.
Haben Sie sich den Befehl 'R CMD SHLIB' angesehen? Damit können Sie einfach Ihre C++ - Funktion in eine DLL-Datei kompilieren und dann die kompilierte Datei mit 'dyn.load()' laden. Schauen Sie sich '' SHLIB'' und '' dyn.load'' für Details an! – user1981275
@ user1981275 Vielen Dank für den Kommentar. Bisher bin ich an diesen Punkt gekommen: C: \ Programme \ R \ R-3.0.1 \ bin \ x64> rcmd SHLIB -oc: \ Benutzer \ mmiller21 \ Dokumente \ r \ Win-Bibliothek \ 3.0 \ rcpp \ include \ logabs2.dll c: \ Benutzer \ mmiller21 \ Dokumente \ r \ Win-Bibliothek \ 3.0 \ rcpp \ include \ logabs2.cpp Ich erhalte die folgende Nachricht: make: *** Keine Regel, um das Ziel c: \ users \ zu machen mmiller21 \ Dokumente \ r \ Win-Bibliothek \ 3.0 \ rcpp \ include \ logabs2.o ', benötigt von' c: \ Benutzer \ mmiller21 \ Dokumente \ r \ Win-Bibliothek \ 3.0 \ rcpp \ include \ logabs2.dll '. Halt. Die Nachricht scheint zu sagen, dass ich eine Objektdatei vermisse, die mir aus meiner Arbeit mit C. vertraut ist. –
Ich benutze das DOS-Befehlsfenster. Wenn das Problem wirklich eine fehlende Objektdatei ist, können Sie vorschlagen, wie ich eine Objektdatei erstellen kann? Vielleicht würde es, sobald es erstellt wurde, in einer Liste zusammen mit logabs2.cpp am Ende des Befehls im vorherigen Kommentar erscheinen? Danke trotzdem. –