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

C++ 将std::map转换为Rcpp::List?,c++,r,rcpp,C++,R,Rcpp,将std::map作为Rcpp::List对象返回的正确方法是什么?默认的wrap()方法将导致一个命名向量返回到R。将来,请在问题中包含您尝试过的内容。当其他人能够解释为什么你的尝试不起作用时,这对你会更有好处。另外,Rlists(和Rcpp::lists)比std::maps更通用,所以我不太确定您是如何在列表中存储映射数据的。大概地图的键对应于列表的名称;以及列表中的值?有一种方法可以做到这一点: #include <Rcpp.h> // [[Rcpp::export]] R

std::map
作为
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::导出]]
Rcpp::列表映射到列表(Rcpp::CharacterVector cv,Rcpp::NumericVector nv){
映射我的地图;
对于(R_xlen_t i=0;isecond;
列表名称[i]=lhs->first;
}
my_list.attr(“名称”)=列表名称;
返回我的_列表;
}
/***R

.name将来,在问题中包括您尝试过的内容。当其他人能够解释为什么你的尝试不起作用时,这对你会更有好处。另外,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::导出]]
Rcpp::列表映射到列表(Rcpp::CharacterVector cv,Rcpp::NumericVector nv){
映射我的地图;
对于(R_xlen_t i=0;isecond;
列表名称[i]=lhs->first;
}
my_list.attr(“名称”)=列表名称;
返回我的_列表;
}
/***R

.姓名谢谢,这是我试图实现的(我悄悄地希望有一个更“烘焙”的方法可用)谢谢,这是我试图实现的(我悄悄地希望有一个更“烘焙”的方法可用)