C++ Code in R ausgeben über Rcpp



  • Hi Community,

    will mein C++ Code in R ausgeben. Hab jetzt einiges über Rcpp Package gelesen und hab auch die Kommunikation aufgebaut , leider will ich von einer Datei die ersten 5 Zeilen in R ausgeben .

    #include <Rcpp.h>
    #include <fstream>
    #include <sstream>
    #include <string>

    using namespace Rcpp;

    //[[Rcpp::export]]
    NumericMatrix read_file_cpp1(std::string path)
    {
    NumericMatrix mat(10,5);
    std::ifstream t(path.c_str());
    std::stringstream ss;

    ss << t.rdbuf();
    return ss.str();
    }

    Der gibt mir aber nur Nullen aus 😕
    Wäre euch echt dankbar



  • 1. Mal wieder keine Code Tags.
    2. Was hast du mit deinem R??? Warum willst du C++ Code nach R konvetieren? Warum programmierst du nicht direkt in R??
    3. Dein Code ist nicht vollständig. So gibt der gar nichts aus!
    4. Offenbar hast du eine "Unused Variable" Warnung des Compilers ignoriert (oder aus???)
    5. Mich würde es wundern, wenn du ein String Stream so zu NumericMatrix konvertieren könntest.



  • 1. Werde ich nächstes mal auf jeden fall machen
    2. Aufgabe: Schreibe C++ Code und gib es in R aus über Rcpp, hab es mir ja nicht ausgesucht
    3. der gibt mir 10 Zeilen und 5 Spalten aber gefüllt nur mit Nullen.



  • Servus28 schrieb:

    1. Werde ich nächstes mal auf jeden fall machen

    Es gibt im Forum auch eine Edit Funktion.

    Servus28 schrieb:

    Aufgabe: Schreibe C++ Code und gib es in R aus über Rcpp, hab es mir ja nicht ausgesucht

    Das die Aufgabe genau so lautet kann ich mir kaum vorstellen (Edit: doch kann ich inzwischen....). Ich habe grade mal einen kurzen blick auf Rcpp geworfen... damit kann man Erweiternugen für R in C++ schreiben. Kann es sein, dass du nur deine Ausgabe von deinem C++ Programm auf deiner R Konsole ausgeben möchtest?
    Hier gibt es ein nettes Paper, welches die Möglichkeiten von Rcpp diskutiert.

    Und hier gibt es eine Erklärung wie man C++ Programme in R kompiliert und in R nutzt.

    Außerdem solltest du dir wohl mal Rcpp::wrap und Rcpp::as anschauen.



  • Danke, werde es mir gleich mal anschauen .
    Hier hab ich mal was nettes gefunden und ein wenig verändert.

    [#include <Rcpp.h>
    #include <fstream>
    #include <iostream>
    using namespace Rcpp;

    //[[Rcpp::export]]
    NumericMatrix readfilecpp(std::string path)
    {
    NumericMatrix output(10,5);
    std::ifstream myfile(path.c_str());
    std::string line;

    std::getline(myfile,line,'\n');

    for(int row=0; row <10; ++row)
    {
    std::string line;
    std::getline(myfile,line,'\n');
    std::stringstream iss(line);
    std::string val;
    std::getline(iss,val,',');

    for(int col=0; col<5; ++col){
    std::string val;
    std::getline(myfile,val,'\n');

    std::stringstream convert(val);
    convert>>output(row,col);
    }
    }

    return(output);
    }

    ]

    Leider gibt er mir lediglich die ersten zwei Eintrage A1j und A2j aus und wiederholt sie solange bis die ersten 10 Zeilen und 5 SPalten voll sind.



  • Servus28 schrieb:

    1. Werde ich nächstes mal auf jeden fall machen



  • #include <Rcpp.h> 
    #include <fstream> 
    #include <iostream> 
    using namespace Rcpp; 
    
    //[[Rcpp::export]] 
    NumericMatrix readfilecpp(std::string path) 
    { 
    NumericMatrix output(10,5); 
    std::ifstream myfile(path.c_str()); 
    std::string line; 
    
    std::getline(myfile,line,'\n'); 
    
    for(int row=0; row <10; ++row) 
    { 
    std::string line; 
    std::getline(myfile,line,'\n'); 
    std::stringstream iss(line); 
    std::string val; 
    std::getline(iss,val,','); 
    
    for(int col=0; col<5; ++col){ 
    std::string val; 
    std::getline(myfile,val,'\n'); 
    
    std::stringstream convert(val); 
    convert>>output(row,col); 
    } 
    } 
    
    return(Output)
    

    Hatte es nicht hinbekommen , aber jetzt



  • In den Unis sollte in IT-Semestern lieber erst mal ein Computer-Führerschein gemacht werden.

    edit: eigenes blah blah entfenrt



  • @Servus28: Als nächstes üben wir noch das korrekte einrücken, dann fängt es an leserlich zu werden.

    Du hattest hier doch schon mal ein Thread, wo es darum ging eben so eine Ausgabe zu erzeugen, halt in C++. Das kopiertst du in eine neue Source Datei und zwar so, dass alles in einer Funktion, nennen wir sie "testout()" steht (keine main()) nennst die test.cpp und schreibst

    #include <Rcpp.h>
    using namespace Rcpp;
    
    // [[Rcpp::export]]
    

    davor.

    Eventuell musst du die Ausgabe auf Rprintf() umstellen. Soll die gleiche Syntax haben wie Printf.

    Dann öffnest du deine R-Konsole und gibst das Folgende ein:

    library(Rcpp)
    sourceCpp("test.cpp")
    testout()
    


  • Sorry für die späte Rückmeldung . Hab es doch ganz anders gemacht und über Rcout ausgeben lassen .

    Danke nochmals



  • Jetzt stehe ich vor der nächsten Ausgabe:
    Die Ausgabe Funktioniert auch über R , aber jetzt soll die Ausgabe in R auch als Objekt erkannt werden um damit weiterarbeiten zu können.

    Jetzt bin ich echt planlos.

    Mein erster Schritt wäre einfach mir mal die Datentypen von R anzugucken , weiter weiss ich leider nicht mehr. 😕

    Wäre echt dankbar für paar Ideen



  • //[[Rcpp::export]]
    
    NumericMatrix readfilecpp(string path)
    {
        ifstream datei (path.c_str());
    
        string line;
    
        if(datei.is_open())
        {
            int linecount =0;
    
            while(getline(datei,line) && linecount <10)
            {
                char * linenow = new char[line.length() +1];
                strcpy(linenow, line.c_str());
    
                char * col = strtok (linenow,",");
                while(col !=NULL)
                {
                    Rcout << setw(12)<<col;
                    col = strtok(NULL, ",");
                }
                Rcout <<endl;
                linecount++;
                delete[]linenow;
            }
            datei.close();
        }
        return 0;
    

    Der gibt mir die Zeilen und Spalten in R aus , leider erkennt R die Werte nicht als Objekt an und daher ist es bis jetzt nur eine Ausgabe , mehr nicht .
    Ich weiss dass mein return wert kein int sein sollte , aber ich krieg es leider nicht gebacken. Habe viele Foren durchgelesen und viel rumprobiert , kann mir da jemand vielleicht weiterhelfen 👍



  • Ich habe in meinem vorletzten Post eine PowerPoint Präsentation verlinkt. In der wird, soweit ich das überblicke, alles erklärt, was du brauchst.


Log in to reply