Ho lavorato la mia strada attraverso Rcpp
tutorial di Dirk Eddelbuettel qui:esecuzione di codice compilato C++ con Rcpp
http://www.rinfinance.com/agenda/
ho imparato come salvare un file C++ in una directory e lo chiamano ed eseguirlo da all'interno di file di R. Il C++ sono in esecuzione si chiama 'logabs2.ccp' e il suo contenuto sono direttamente da una delle diapositive di Dirk:
#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;
}
l'eseguo con questo codice R:
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
Sto eseguendo il codice su un computer Windows 7 dall'interno della GUI R che sembra installare per impostazione predefinita. Ho anche installato la versione più recente di Rtools
. Il codice R sopra riportato sembra richiedere un tempo relativamente lungo per essere eseguito. Sospetto che la maggior parte di quel tempo sia dedicata alla compilazione del codice C++ e che una volta compilato il codice C++ viene eseguito molto rapidamente. Microbenchmark
suggerisce certamente che Rcpp
riduce il tempo di calcolo.
Fino ad ora non ho mai usato il C++, ma so che quando compilo il codice C ottengo un file * .exe. Ho cercato il mio disco rigido da un file chiamato logabs2.exe
ma non riesco a trovarne uno. Mi chiedo se il suddetto codice C++ potrebbe essere eseguito anche più rapidamente se è stato creato un file logabs2.exe
. È possibile creare un file logabs2.exe
e memorizzarlo in una cartella da qualche parte e quindi chiamare Rcpp quel file ogni volta che volevo usarlo? Non so se abbia senso. Se potessi memorizzare una funzione C++ in un file * .exe, forse non dovrei compilare la funzione ogni volta che volessi usarla con Rcpp e forse il codice Rcpp sarebbe ancora più veloce.
Ci scusiamo se questa domanda non ha senso o è un duplicato. Se è possibile memorizzare la funzione C++ come file * .exe, spero che qualcuno mi mostrerà come modificare il mio codice R sopra per eseguirlo. Grazie per l'aiuto con questo o per avermi fatto capire perché ciò che suggerisco non è possibile o consigliato.
Non vedo l'ora di vedere il nuovo libro di Dirk.
Hai guardato il comando 'R CMD SHLIB'? Con ciò puoi semplicemente compilare la tua funzione C++ in un file dll e quindi caricare il file compilato con 'dyn.load()'. Dai un'occhiata a '? SHLIB' e'? Dyn.load' per i dettagli! – user1981275
@ user1981275 Grazie per il commento. Finora sono arrivato a questo punto: C: \ Programmi \ R \ R-3.0.1 \ bin \ x64> rcmd SHLIB -oc: \ users \ mmiller21 \ documents \ r \ win-library \ 3.0 \ rcpp \ include \ logabs2.dll c: \ users \ mmiller21 \ documents \ r \ win-library \ 3.0 \ rcpp \ include \ logabs2.cpp Ricevo il seguente messaggio: make: *** Nessuna regola per rendere target 'c: \ users \ mmiller21 \ documents \ r \ win-library \ 3.0 \ rcpp \ include \ logabs2.o ', necessario per' c: \ users \ mmiller21 \ documents \ r \ win-library \ 3.0 \ rcpp \ include \ logabs2.dll '. Stop. Il messaggio sembra dire che mi manca un file oggetto, a me familiare dal mio lavoro con C. –
Sto usando la finestra di comando DOS. Se il problema è davvero un file oggetto mancante puoi suggerire come posso creare un file oggetto? Forse una volta creato verrà inserito in un elenco insieme a logabs2.cpp alla fine del comando nel commento precedente? Grazie a prescindere. –