将 std::map 转换为 Rcpp::List?
converting an std::map to an Rcpp::List?
将 std::map< std::string, double >
作为 Rcpp::List
对象返回的正确方法是什么?默认 wrap()
方法导致命名向量返回给 R。
以后,请在您的问题中包含您尝试过的内容。当其他人能够解释 为什么 您尝试的方法不起作用时,这对您会更有帮助。此外,R list
s(和 Rcpp::List
s)比 std::map
s 更通用,所以我不太确定您如何尝试将地图数据存储在列表中。大概地图的键对应于列表的名称;以及列表值的值?这是执行此操作的一种方法:
#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());
开始,我将 return 对象初始化为 std::map
的大小;同样,Rcpp::CharacterVector
将用作 return 对象的名称。使用 map
迭代器和辅助索引变量,映射的值 (iterator->second
) 被分配到列表中的相应位置,而它的键 (iterator->first
) 被分配给临时名称向量。最后,将其分配给结果列表,然后 return 它。
将 std::map< std::string, double >
作为 Rcpp::List
对象返回的正确方法是什么?默认 wrap()
方法导致命名向量返回给 R。
以后,请在您的问题中包含您尝试过的内容。当其他人能够解释 为什么 您尝试的方法不起作用时,这对您会更有帮助。此外,R list
s(和 Rcpp::List
s)比 std::map
s 更通用,所以我不太确定您如何尝试将地图数据存储在列表中。大概地图的键对应于列表的名称;以及列表值的值?这是执行此操作的一种方法:
#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());
开始,我将 return 对象初始化为 std::map
的大小;同样,Rcpp::CharacterVector
将用作 return 对象的名称。使用 map
迭代器和辅助索引变量,映射的值 (iterator->second
) 被分配到列表中的相应位置,而它的键 (iterator->first
) 被分配给临时名称向量。最后,将其分配给结果列表,然后 return 它。