[英]converting an std::map to an Rcpp::List?
返回std::map< std::string, double >
作為Rcpp::List
對象的正確方法是什么? 默認的wrap()
方法導致將命名的向量返回給R。
將來,請包括您在問題中嘗試過的內容。 當其他人能夠解釋您嘗試的原因為何不起作用時,它將對您更加有益。 而且,R list
(和Rcpp::List
)比std::map
更具通用性,因此我不太確定您是如何嘗試在列表中存儲地圖數據的。 大概地圖的鍵對應於列表的名稱。 以及列表值的值? 這是執行此操作的一種方法:
#include <Rcpp.h>
// [[Rcpp::export]]
Rcpp::List map_to_list(Rcpp::CharacterVector cv, Rcpp::NumericVector nv) {
std::map<std::string, double> my_map;
for (R_xlen_t i = 0; i < cv.size(); i++) {
my_map.insert(std::make_pair(Rcpp::as<std::string>(cv[i]), nv[i]));
}
Rcpp::List my_list(my_map.size());
Rcpp::CharacterVector list_names(my_map.size());
std::map<std::string, double>::const_iterator lhs = my_map.begin(), rhs = my_map.end();
for (R_xlen_t i = 0; lhs != rhs; ++lhs, i++) {
my_list[i] = lhs->second;
list_names[i] = lhs->first;
}
my_list.attr("names") = list_names;
return my_list;
}
/*** R
.names <- letters[1:20]
.values <- rnorm(20)
(res <- map_to_list(.names, .values))
#$a
#[1] -0.8596328
#$b
#[1] 0.1300086
#$c
#[1] -0.1439214
#$d
#[1] -1.017546
## etc...
*/
以Rcpp::List my_list(my_map.size());
,我正在將返回對象初始化為std::map
的大小; 同樣對於Rcpp::CharacterVector
,它將用作返回對象的名稱。 使用map
迭代器和輔助索引變量,將映射的值( iterator->second
)分配給列表中的相應位置,而將其鍵( iterator->first
)分配給臨時名稱向量。 最后,將其分配給結果列表,然后將其返回。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.