2013-07-01 9 views
5

Wie übertrage ich eine Karte/ein Verzeichnis/eine Liste von R als Parameter in eine C++ Funktion?Rcpp map/dictionary/list

Zum Beispiel möchte ich so etwas wie die folgenden Funktionen ausführen:

#include <Rcpp.h> 
using namespace Rcpp; 

// [[Rcpp::export]] 
int test(List map) { 
    int val = map["test"]; 
    return(val); 
} 

/*** R 
map <- list(test = 200, hello = "a") 
test(map) 
*/ 

, wo die Ausgabe 200

+0

Ich habe gerade versucht, den Code wie es ist, 'sourceCpp' mit und ich habe 200. Was ist Ihr' sessionInfo' ? – dickoa

+0

R Version 3.0.1 (2013-05-16) Plattform: x86_64-apple-darwin10.8.0 (64-Bit) Gebietsschema: [1] de_DE.UTF-8/de_DE.UTF-8/de_DE. UTF-8/C/en_US.UTF-8/8-en_US.UTF angebracht Basispakete: [1] stats Grafiken grDevices utils Datensätze Methoden Basis andere angeschlossene Pakete: [1] foreach_1.4.1 fpc_2.1 -5 flexmix_2.3-10 gitter_0.20-15 mclust_4.1 cluster_1.14.4 [7] MASS_7.3-26 Rcpp_0.10.3 über einen Namespace geladen (und nicht angehängt): [1] codetools_0.2- 8 grid_3.0.1 iterators_1.0.6 modeltools_0.2-19 stats4_3.0.1 [6] tools_3.0.1 –

+0

Ich benutze Linux nicht Mac und weiß nicht, ob es verwandt ist. Aber in meinem Setup habe ich 'packageVersion (" Rcpp ") == '0.10.4''. Versuchen Sie, Rcpp von R-Schmiede zu erhöhen und den Code erneut auszuführen. – dickoa

Antwort

1

Ich habe ein ähnliches Problem auf Mac OS X. Starten Sie Ihren Snippet zurückgeben 1. Allerdings, wenn ich den Code in folgender Weise modifizieren funktioniert es:

#include <Rcpp.h> 
using namespace Rcpp; 

// [[Rcpp::export]] 
int test(List map) { 
    int val = as<int>(map["test"]); 
    return(val); 
} 

/*** R 
map <- list(test = 200, hello = "a") 
test(map) 
*/ 

Es scheint wie etwas falsch mit dem Typinferenz gehen - der Compiler sollte „wissen“, dass, da wir map["test"] zu einer Zuordnung sind int -deklarierte Variable, die als int konvertiert werden sollte, aber das scheint nicht der Fall zu sein. Also, um sicher zu sein - seien Sie sicher, as alles, was aus einer R-Liste kommt.

Auch es ist erwähnenswert: in R 200 ist ein double; Wenn Sie eine int explizit übergeben möchten, sollten Sie 200L schreiben.

FWIW, ich bin Kompilieren mit clang++:

> clang++ -v 
Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn) 
Target: x86_64-apple-darwin12.4.0 
Thread model: posix 

und

> sessionInfo() 
R version 3.0.0 (2013-04-03) 
Platform: x86_64-apple-darwin10.8.0 (64-bit) 

locale: 
[1] en_CA.UTF-8/en_CA.UTF-8/en_CA.UTF-8/C/en_CA.UTF-8/en_CA.UTF-8 

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] Rcpp_0.10.4 
+0

Sieht aus wie ein Fehler. Ich gucke mal. –

1

sein sollte Darf ich nicht vollständig verstehen, was Sie wirklich wollen, aber wenn Sie möchten, passieren Funktion, um eine R-Liste als Parameter Cpp möglich, es ist

Cpp Code

#include <Rcpp.h> 

using namespace Rcpp; 

// [[Rcpp::export]] 
int test(List map) { 
    int number = 10;  
    int val = map["test"] + number; 
    return(val); 
} 

/*** R 
map <- list(test = 2, hello = "a") 
test(map) 
*/ 

Angenommen, Sie diesen Cpp Code auf "/tmp/test.cpp"

gespeichert immer scheint

R Code

require(Rcpp) 
sourceCpp("/tmp/test.cpp") 
test(map) 
## [1] 12 
+0

das ist, was ich wollte, aber es funktioniert nicht (ich bekomme die Ausgabe 11, egal was ich für die Nummer) –

+0

@tsuyoihikari Ohne Ihren Code ist schwer zu sagen Beispiel genau wie geschrieben? – dickoa

+0

ja ich tat, (außer ich habe hinzugefügt rcpp.h) –