2013-07-01 23 views
5

Come si passa in una mappa/dizionario/elenco da R come parametro a una funzione C++?Rcpp map/dictionary/list

Per esempio, voglio fare qualcosa di simile al seguente:

#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) 
*/ 

in cui l'uscita dovrebbe essere 200.

+0

Ho appena provato il codice come è, usando 'sourceCpp' ed ho ottenuto 200. Qual è il tuo' sessionInfo' ? – dickoa

+0

R versione 3.0.1 (2013/05/16) Piattaforma: x86_64-apple-darwin10.8.0 (64-bit) locale: [1] en_US.UTF-8/en_US.UTF-8/it. UTF-8/C/en_US.UTF-8/en_US.UTF-8 pacchetti base allegate: [1] previsti grDevices Grafica utils set di dati di base metodi altri pacchetti allegati: [1] foreach_1.4.1 fpc_2.1 -5 flexmix_2.3-10 lattice_0.20-15 mclust_4.1 cluster_1.14.4 [7] MASS_7.3-26 Rcpp_0.10.3 caricato tramite un namespace (e non allegato): [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

Io uso linux non mac e non so se è correlato. Ma nel mio setup ho 'packageVersion (" Rcpp ") == '0.10.4''. Prova ad uprgade Rcpp da r-forge ed esegui nuovamente il codice. – dickoa

risposta

1

Ho un problema simile su Mac OS X. Il funzionamento del vostro frammento sembra sempre restituire 1. Tuttavia, se modifico il codice nel seguente modo in cui funziona:

#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) 
*/ 

Sembra che qualcosa sta andando male con l'inferenza di tipo - il compilatore dovrebbe "sapere" che, dal momento che stiamo assegnando a un map["test"]int - variabile dichiarata che deve essere convertita come int, ma questo non sembra essere il caso. Quindi, per sicurezza - assicurati di as tutto ciò che esce da un elenco R.

Inoltre, vale la pena affermare: in R 200 è un double; se si desidera passare esplicitamente uno , è necessario scrivere 200L.

FWIW, sto compilazione con 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 

e

> 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

Sembra un bug. Darò un occhiata. –

1

Può essere che non capisco pienamente ciò che si vuole veramente, ma se si desidera superare un elenco R come parametro Cpp funzionare è possibile

codice Cpp

#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) 
*/ 

Supponiamo che si è salvato questo codice Cpp a "/tmp/test.cpp"

codice R

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

è quello che volevo, ma non funziona (ottengo l'output per essere 11, non importa cosa ho messo per il numero) –

+0

@tsuyoihikari Senza il tuo codice è difficile dire. Hai provato il mio esempio esattamente come scritto? – dickoa

+0

sì ho fatto, (tranne che ho aggiunto include rcpp.h) –