Rcpp:使用相等范围通过键求和多图值

时间:2018-06-24 02:55:02

标签: stl rcpp multimap accumulate equal-range

下面有一个代码段,其中封装了我遇到的问题。

我想做的事情在R中是微不足道的,但是在Rcpp中要困难得多。我只是尝试根据它们各自的键汇总值。在此示例中,我只是尝试获取与第一个键对应的值的总和。我在C ++中做过非常相似的事情,但是由于某些原因,Rcpp端口给了我一些问题。

此外,请注意,所提供的代码仅用于表示我所遇到的更大的问题。因此,我知道仅尝试在Rcpp中实现这一点并不能很好地利用时间。

#include <Rcpp.h>
using namespace Rcpp;
using namespace std;
// [[Rcpp::export]]

int mmap(List x) {

std::multimap<int, int> out;

  for(int i = 0; i < x.size(); ++i) {
    int key_temp = as<List>(as<List>(x[i]))[0];
    int value_temp = as<List>(as<List>(x[i]))[1];
    out.insert(make_pair(key_temp, value_temp));  
  }

 pair<multimap<int, int>::iterator, multimap<int, int>::iterator> range = out.equal_range(1);
 int total = accumulate(range.first, range.second,  0);

  return total;
}

/*
xList <- list()
xList[[1]] <- list()
xList[[1]][1] <- 1
xList[[1]][2] <- 1
xList[[2]] <- list()
xList[[2]][1] <- 1
xList[[2]][2] <- 2
xList[[3]] <- list()
xList[[3]][1] <- 2
xList[[3]][2] <- 2
xList[[4]] <- list()
xList[[4]][1] <- 1
xList[[4]][2] <- 2

mmap(xList)
 */

1 个答案:

答案 0 :(得分:4)

您收到的第一条错误消息之一是很有启发性的:

  

/ usr / include / c ++ / 7 / bits / stl_numeric.h:127:18:错误:“ operator +”不匹配(操作数类型为“ int”和“ std :: pair”)

编译器不知道如何将初始值(int)与迭代器的新值(代表键值对的pair)相加。幸运的是std::accumulate带有一个可选参数,该参数带有要应用的函数。使用C ++ 11,我们可以使用一个简单的lambda函数:

#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::plugins(cpp11)]]
// [[Rcpp::export]]
int mmap(List x) {

  std::multimap<int, int> out;

  for(int i = 0; i < x.size(); ++i) {
    int key_temp = as<List>(as<List>(x[i]))[0];
    int value_temp = as<List>(as<List>(x[i]))[1];
    out.insert(std::make_pair(key_temp, value_temp));  
  }

  auto range = out.equal_range(1);
  int total = std::accumulate(range.first, range.second,  0,
                         [](int a, std::pair<const int, int> b) { return a + b.second; });

  return total;
}

/*** R
 xList <- list()
 xList[[1]] <- list()
 xList[[1]][1] <- 1
 xList[[1]][2] <- 1
 xList[[2]] <- list()
 xList[[2]][1] <- 1
 xList[[2]][2] <- 2
 xList[[3]] <- list()
 xList[[3]][1] <- 2
 xList[[3]][2] <- 2
 xList[[4]] <- list()
 xList[[4]][1] <- 1
 xList[[4]][2] <- 2

 mmap(xList)
 */

结果:

> mmap(xList)
[1] 5