当前位置:  开发笔记 > 编程语言 > 正文

将std :: map转换为Rcpp :: List?

如何解决《将std::map转换为Rcpp::List?》经验,为你挑选了1个好方法。

将对象std::map< std::string, double >作为Rcpp::List对象返回的正确方法是什么?默认wrap()方法导致命名向量返回到R.



1> nrussell..:

将来,请在您的问题中包含您尝试过的内容.当别人能够解释你为什么尝试不起作用时,对你来说会更有益.此外,R lists(和Rcpp::Lists)比std::maps 更通用,所以我不太确定你是如何尝试将地图的数据存储在列表中的.据推测,地图的键对应于列表的名称; 和列表值的值?这是一种方法:

#include 

// [[Rcpp::export]]
Rcpp::List map_to_list(Rcpp::CharacterVector cv, Rcpp::NumericVector nv) {
  std::map my_map;

  for (R_xlen_t i = 0; i < cv.size(); i++) {
    my_map.insert(std::make_pair(Rcpp::as(cv[i]), nv[i]));
  }

  Rcpp::List my_list(my_map.size());
  Rcpp::CharacterVector list_names(my_map.size());
  std::map::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迭代器和辅助索引变量,将map的值(iterator->second)分配给列表中的相应位置,而将其keys(iterator->first)分配给临时名称向量.最后,将其分配给结果列表,并将其返回.

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有