我是Rcpp
和C++
的新手。我正在尝试将以下R
代码转换为RCpp。
library (compiler)
robzscore<-cmpfun(function(x) {
byec <- sum(!is.na(x))
byer <- rank(x, na.last="keep", ties.method="average") - 0.5
as.data.frame(suppressWarnings(qnorm(byer/byec)), row.names=NULL)
})
我正在努力编写需要获取ranks
的部分的语法。例如,这是我写的(在我使用cpp
编译的单独的sourceCpp
文件中)基于我在SO上找到的其他代码,作为rank(x,...)
函数的等价物{ {1}}假设没有R
s(并且没有处理关系):
NA
错误是:
#include <Rcpp.h>
#include <algorithm>
#include <iostream>
using namespace Rcpp;
template <typename T>
std::vector<size_t> sort_indexes(const std::vector<T> &v) {
// initialize original index locations
std::vector<size_t> idx(v.size());
for (size_t i=0; i!=idx.size();++i) idx[i]=i;
// sort indexes based on comparing values in v
std::sort(idx.begin(),idx.end(),[&v](size_t i1, size_t i2) {return v[i1]<v[i2];});
// return the values
return idx;
}
// [[Rcpp::export]]
NumericVector do_rank(NumericVector x) {
std::vector<float> y=as<std::vector<float> >(x);
return wrap(sort_indexes(y));
}
- 后面是 - lambda expressions only available with -std=c++0x or -std=gnu++0x [enabled by default]
,位于我的代码显示为no matching function for call to 'sort(std::vector<long long unsigned int>::iterator, std::vector<long long unsigned int>::interator, sort_indexes(const std::vector<T> &) [ with T=float]::<lambda(long long unsigned int, long long u
nsigned int)>)'
的地方。
std::sort(idx.begin(),...)
:~/R/win-library/3.0/Rcpp/include/Rcpp/internal/wrap.h
。
我怀疑主要问题是我在处理invalid conversion from 'long long unsigned int' to 'SEXP' [-fpermissive]
的语法中犯了一些错误(将Rcpp
转换为Rcpp
数据结构,反之亦然。)
有人可以帮我解释错误和/或可能是正确的方法吗?
谢谢,