Rcpp:使用相等范围按键对多图值求和
Posted
技术标签:
【中文标题】Rcpp:使用相等范围按键对多图值求和【英文标题】:Rcpp: sum multimap values by key using equal range 【发布时间】:2018-06-24 02:55:02 【问题描述】:下面我有一个代码 sn-p 封装了我遇到的问题。
我正在尝试做的事情在 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)
*/
【问题讨论】:
有些事情看起来很奇怪:您的out
是 multimap<int, int>
但后来您使用 multimap
的 vector<int>
而不是 int
的迭代器。故意的?
不,不是故意的,谢谢你的收获。如果这不是 equal_range 的正确用法,你会说我该怎么做?我确信我可以写一个循环,我只是认为会有一个更简单的解决方案。虽然我离 C++ 专家最远,所以我可能是错的。
我用它搞砸了一两分钟,我把大部分东西都修好了,但我不知道 accumulate()
是否可以在迭代器的 pair
上工作。编译问题的页面。
拥有using namespace std
是个坏主意,尤其是当您已经拥有using namespace Rcpp
时。
【参考方案1】:
您收到的第一个错误消息具有指导意义:
/usr/include/c++/7/bits/stl_numeric.h:127:18: error: no match for ‘operator+’ (operand types are ‘int’ and ‘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
【讨论】:
优秀。我也有同样的想法,但已经晚了,我没有尝试。很好的答案。以上是关于Rcpp:使用相等范围按键对多图值求和的主要内容,如果未能解决你的问题,请参考以下文章