2013-07-01 28 views
5

Jak przekazać mapę/słownik/listę z R jako parametr do funkcji C++?Rcpp mapa/słownik/lista

Na przykład, chcę zrobić coś jak następuje:

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

gdzie wyjście powinno być 200.

+0

Próbowałem tylko swój kod jak to, że używanie 'sourceCpp' i mam 200. Jaki jest Twój' sessionInfo' ? – dickoa

+0

R wersja 3.0.1 (2013-05-16) Platforma: x86_64-apple-darwin10.8.0 (64-bit) locale: [1] en_US.UTF-8/en_US.UTF-8/en_US. UTF-8/C/en_US.UTF-8/en_US.UTF-8 dołączone pakiety podstawowe: [1] Statystyki grDevices graficzne narzędzi z metod zestawy danych bazowych innych podłączonych pakiety: [1] foreach_1.4.1 fpc_2.1 -5 flexmix_2.3-10 krata_0.20-15 mclust_4.1 klaster_1.14.4 [7] MASS_7.3-26 Rcpp_0.10.3 ładowany przez przestrzeń nazw (i niepowiązany): [1] codetools_0.2- 8 siatka_3.0.1 iteratory_1.0.6 modeltools_0.2-19 stats4_3.0.1 [6] tools_3.0.1 –

+0

Używam linux a nie mac i nie wiem, czy jest to powiązane. Ale w mojej instalacji mam 'packageVersion (" Rcpp ") == '0.10.4''. Spróbuj podnieść Rcpp z r-kuge i ponownie uruchom kod. – dickoa

Odpowiedz

1

mam podobny problem w systemie Mac OS X. wyświetlanie fragment wydaje się zawsze return 1. Jednakże, jeśli zmodyfikować kod w następujący sposób to działa:

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

Wydaje się, że coś jest nie tak z typem wnioskowania - kompilator powinien „wiedzieć”, że skoro jesteśmy przypisanie map["test"] do int -odkreślona zmienna, która powinna zostać przekształcona jako int, ale wydaje się, że tak nie jest. Tak więc, aby być bezpiecznym - upewnij się, że wszystko, co wychodzi z listy R.

Warto również zaznaczyć: w R 200 jest to double; Jeśli chcesz jawnie przekazać numer int, powinieneś napisać: 200L.

FWIW, jestem kompilacji z 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 

i

> 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

Wygląda jak błąd. Zobaczę. –

1

Może być nie w pełni zrozumieć, co naprawdę chcesz, ale jeśli chcesz przekazać listy R jako parametr dla CPP działać to możliwe

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

Załóżmy, że został zapisany ten kod KPP w "/tmp/test.cpp"

kodu R

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

to jest to, czego chciałem, ale to nie działa (ja dostaję wynik na 11 niezależnie od tego, co umieściłem w numerze) –

+0

@tsuyoihikari Bez twojego kodu trudno powiedzieć. przykład dokładnie tak, jak napisano? – dickoa

+0

tak, zrobiłem (oprócz dodania rcpp.h) –