2016-07-06 7 views
0

Wenn ich einige funktionierende Rcpp-Code anpassen, um es in eine Klasse zu setzen, funktioniert es nicht mehr. HierRcpp kompilieren Fehler: kann die Liste nicht in SEXP konvertieren

ist die Arbeit, nicht-klassenbasierte Code:

#include <Rcpp.h> 
using namespace Rcpp; 

// [[Rcpp::export]] 
List test1_() { 
    Rcpp::NumericVector x = Rcpp::NumericVector::create(1.0); 
    return Rcpp::List::create(Rcpp::Named("x") = x); 
} 

Aber wenn ich trennen es in CPP ...

// testlist.cpp 
#include <Rcpp.h> 
#include "testlist.h" 
using namespace Rcpp; 

// [[Rcpp::export]] 
SEXP test2_() { 
    testlist a_testlist; 
    return a_testlist.test; 
} 

... und .h ...

// testlist.h 
#ifndef TESTLIST_ 
#define TESTLIST_ 

#include <Rcpp.h> 

class testlist { 

public: 

    testlist() {} 

    Rcpp::List test() { 
    Rcpp::NumericVector x = Rcpp::NumericVector::create(1.0); 
    return Rcpp::List::create(Rcpp::Named("x") = x); 
    } 

}; 

#endif 

... dann bekomme ich den folgenden Kompilierungsfehler.

g++ -I/usr/include/R/ -DNDEBUG -D_FORTIFY_SOURCE=2 -I"/home/nacnudus/R/x86_64-pc-linux-gnu-library/3.3/Rcpp/include" -fpic -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -c RcppExports.cpp -o RcppExports.o 
g++ -I/usr/include/R/ -DNDEBUG -D_FORTIFY_SOURCE=2 -I"/home/nacnudus/R/x86_64-pc-linux-gnu-library/3.3/Rcpp/include" -fpic -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -c testlist.cpp -o testlist.o 
testlist.cpp: In function ‘Rcpp::List test2_()’: 
testlist.cpp:8:21: error: cannot convert ‘testlist::test’ from type ‘Rcpp::List (testlist::)() {aka Rcpp::Vector<19> (testlist::)()}’ to type ‘Rcpp::List {aka Rcpp::Vector<19>}’ 
    return a_testlist.test; 
        ^~~~ 
make: *** [/usr/lib64/R/etc/Makeconf:141: testlist.o] Error 1 
ERROR: compilation failed for package ‘testlist’ 
* removing ‘/tmp/RtmppNxPq5/devtools_install_f654fb60a32/testlist’ 

Was mache ich falsch?

Antwort

2

Einfache Tippfehler:

return a_testlist.test; 

Muss sein:

return a_testlist.test(); 

Obwohl, sollten Sie die Rcpp-modules Vignette Lesen betrachten Klassen richtig zu belichten.

+0

Das funktionierte, aber erst nachdem ich das Verzeichnis gelöscht und neu angefangen hatte. Ich habe die() wegen der Begegnung mit dem Problem in dieser Frage weggelassen: http://StackOverflow.com/a/877538/937932, aber vielleicht ist das nur für das Deklarieren von Instanzen von Klassen, nicht für das Aufrufen von Methoden. – nacnudus

+0

Ich habe die Vignette gelesen, aber nicht gesehen, was sie in diesem Fall hinzufügen musste, da ich bereits '// [[Rcpp :: export]]' verwendet habe. Es scheint direkt mehr um ganze Klassen zu R zu gehen, was ich definitiv nicht versuche, oder habe ich falsch verstanden? – nacnudus

+0

** Kommentar 1: ** Das 'Foo' war eine neue Klasseninitialisierung, während hier eine Methode aufgerufen wird. ** Kommentar 2: ** Bei der Modulkomponente geht es darum, ganze Klassen in R verfügbar zu machen. Wenn Sie das nicht als Feature benötigen, fahren Sie einfach mit der aktuellen Klassendeklaration und dem zweiten Methodenexport fort. Es kann jedoch etwas fehleranfälliger sein. – coatless

Verwandte Themen