[英]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.