2013-07-01 6 views
5

Как передать в карте/словаре/список из R в качестве параметра функцию C++?Rcpp map/dictionary/list

Например, я хочу сделать что-то вроде следующего:

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

, где выход должен быть 200.

+0

Я просто попробовал ваш код, как есть, используя 'sourceCpp' и я получил 200. Что ваш' sessionInfo' ? – dickoa

+0

R version 3.0.1 (2013-05-16) Платформа: x86_64-apple-darwin10.8.0 (64-разрядная) Язык: [1] ru_US.UTF-8/en_US.UTF-8/en_US. UTF-8/С/en_US.UTF-8/en_US.UTF-8 прикрепленных базовых пакеты: [1] Статистика графики grDevices UTILS наборов данных базовых методами других прикрепленных пакетов: [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 загружен через пространство имен (и не прилагается): [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

Я использую linux не mac и не знаю, связано ли это. Но в моей настройке у меня есть 'packageVersion (" Rcpp ") == '0.10.4''. Попытайтесь активировать Rcpp из r-forge и снова запустите код. – dickoa

ответ

1

У меня аналогичная проблема на Mac OS X. Запуск ваш фрагмент кода, кажется, всегда возврат 1. Однако, если я изменить код следующим образом он работает:

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

Похоже, что-то происходит не так с умозаключения типа - компилятор должен «знать», что, так как мы присваиваем map["test"] Ань int -declared переменная, которая должна быть преобразована как int, но это, похоже, не так. Итак, чтобы быть в безопасности - обязательно as все, что выходит из списка R.

Кроме того, стоит указать: в R 200 есть double; если вы хотите явно передать int, вы должны написать 200L.

FWIW, я компиляции с 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 

и

> 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

Похож на ошибку. Я посмотрю. –

1

Может быть, я не совсем понимаю, что вы действительно хотите, но если вы хотите чтобы передать список R в качестве параметра Cpp функционировать вполне возможно

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

Предположим, что вы сохранили этот CPP код на "/tmp/test.cpp"

R код

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

это то, что я хотел, но он не работает (я получаю вывод 11, независимо от того, что я положил для числа) –

+0

@tsuyoihikari Без вашего кода сложно сказать. например, как написано? – dickoa

+0

Да, я сделал (кроме добавления rcpp.h) –

Смежные вопросы