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?
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
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
** 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