2017-06-26 5 views
0

Meine Frage ist ziemlich einfach:Applied R Funktion in Cpp mit RCPP

ich derzeit versuche, meine r Code zu beschleunigen, indem RCPP mit einigen C++ Code zu schreiben. Aber jetzt muss ich einige Funktionen einfügen, die ich selbst in R geschrieben habe. Wie könnte ich das tun?

Edit1: Beispielcode.

Ich habe drei Funktion, die ich selbst geschrieben habe, werden sie genannt:

1.pre_process. 2.Übertragungselement. 3. Vorhersage.

#include <Rcpp.h> 
using namespace Rcpp; 

NumericVector sel_p; 
NumericVector pur_p; 
int k = sel_p.length(); 
int bps = 20; 
NumericVector pur_p_temp(pur_p.begin(), sel_p.end()); 
float profit = sum(sel_p) + sum(pur_p_temp); 
NumericVector minute_data; 
NumericMatrix dataset; 

int main(){ 
    while(TRUE){ 
    //GET MINUTE DATA HERE. 
    if (minute_data == dataset.end()) { 
     std::cout << "repeating" << std::endl; 
    } else if(minute_data != dataset.end()) { 
     dataset.push_back(minute_data) 
     std::cout << "Working!No Worries." << std::endl; 
     if (dataset.nrow() > bps) { 
     //transfer_element here. 
     //pre_process here. 
     //prediction here. 
     } 
     } 
    } 
    } 
} 

In R-Code, werde ich „DGET“ Funktion gespeicherte Funktion aufzurufen, und ich habe keine Ahnung, darüber ++ oder RCPP in c zu tun.

Alle drei Funktionen sind in reinem R-Code geschrieben und übertragen sie in C++ wird mich töten. Wenn mehr Informationen benötigt werden, lassen Sie es mich wissen.

Vielen Dank im Voraus,

Peter

+0

Bitte teilen Sie ein Beispiel Ihres C++ - und R-Codes und was Sie damit versuchen. Wenn es viel Code ist, ein kleines Beispiel. – SymbolixAU

+0

Sicher, danke für die Beratung. – PetaGlz

+0

Kasse RInside http://dirk.eddelbuettel.com/code/rinside.html –

Antwort

0

C++ ist ein anderes Tier als R. Fügen Sie in der Notwendigkeit Übertragung ein Objekt von R in C++ und Dinge können ein bisschen haarig werden.


Betrachten.

NumericVector sel_p; 
NumericVector pur_p; 
int k = sel_p.length(); 
int bps = 20; 
NumericVector pur_p_temp(pur_p.begin(), sel_p.end()); 
float profit = sum(sel_p) + sum(pur_p_temp); 
NumericVector minute_data; 
NumericMatrix dataset; 

kein Raum außerhalb des globalen Umfang ist, dass diese Variablen in ruhen kann jedoch das Fehlen geeigneter Initialisierung problematisch ist. Betrachten Sie insbesondere die pur_p Variable, die anfänglich definiert, aber nicht initialisiert ist. Diese Variable wird später bearbeitet, um pur_p_temp zu erstellen.


Als nächstes wollen wir kurz über int main() Verwendung sprechen. In diesem speziellen Fall müssen die Funktionen nicht auf diese Weise benannt werden, da dies R 's Vorrecht ist. Also, nennen wir Ihre Funktion void hey_ya().

Zusätzlich zu benutzen, um Ihre Funktion innerhalb R, müssen Sie // [[Rcpp::export]]


Mit dem oben genannten angeben wird, können Sie Ihren Code wie so gestaltet werden soll:

#include <Rcpp.h> 

// [[Rcpp::export]] 
void hey_ya(Rcpp::NumericVector sel_p, Rcpp::NumericVector pur_p, 
      Rcpp::NumericVector minute_data, Rcpp::NumericMatrix dataset){ 

    int k = sel_p.length(); 
    int bps = 20; 
    Rcpp::NumericVector pur_p_temp(pur_p.begin(), sel_p.end()); 
    float profit = sum(sel_p) + sum(pur_p_temp); 

    while(TRUE){ 
     // GET MINUTE DATA HERE. 
     if (minute_data == dataset.end()) { 
      Rcpp::Rcout << "repeating" << std::endl; 
     } else if(minute_data != dataset.end()) { 
      dataset.push_back(minute_data) 
      Rcpp::Rcout << "Working! No Worries." << std::endl; 
      if (dataset.nrow() > bps) { 
       //transfer_element here. 
       //pre_process here. 
       //prediction here. 
      } 
     } 
    } 
} 

Da Sie jedoch ein komplettes Beispiel weggelassen haben ... Hier ist ein Spielzeug-Display, wie man mit dget in Rcpp arbeitet.

#include <Rcpp.h> 

// [[Rcpp::export]] 
Rcpp::NumericVector dget_example(std::string file) { 
    // Obtain environment containing function 
    Rcpp::Environment base("package:base"); 

    // Make function callable from C++ 
    Rcpp::Function dget_r = base["dget"]; 

    // Call the function and receive its list output 
    Rcpp::NumericVector res = dget_r(Rcpp::Named("file") = file); 
    // Change the above data type depending on _X_ object. 

    return res; 
} 
+0

Danke für Ihre geduldige und vollständige Antwort zuerst, ich schätze es wirklich. Ich bin noch ein Anfänger in C++, also bitte vergib mir, wenn ich eine wirklich dumme Frage gestellt habe. Wie sollte ich meinen Datentyp entsprechend ändern? Wie ist es abhängig von meiner Ausgabe oder Eingabe? – PetaGlz

+0

Abhängig davon, was in 'Datei' gelesen wird mit' dget'. In diesem Fall habe ich angenommen, dass es vom Typ "Numerisch" ist. – coatless

+0

Ich versuche, eine R-Datei namens trans.R zu lesen, ist, wie beurteilen Sie den Typ? Es ist vollständig in R-Code geschrieben, ich werde numerisch versuchen. – PetaGlz

Verwandte Themen