簡體   English   中英

將std :: map轉換為Rcpp :: List?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM