我是初学者使用Rcpp,我想在计算分位数后更快地选择矢量值。在下面的示例中,它在较低和较高限制时运行良好 由qnorm函数计算的是手动输入的(函数val.sel.1)。然而,当这些限制来自先前的计算时,没有得到结果向量(函数val.sel.2)。我想知道在使用我的论点时出了什么问题。 在此先感谢您的帮助。 阿兰
R> src.1 <-'
NumericVector x = xx, p = prob;
int n = p.size() ;
int m = x.size() ;
NumericVector res(n), quant ;
for( int i=0; i<n; i++) res[i] = R::qnorm(p[i], Rcpp::mean(x), Rcpp::sd(x), 1, 0) ;
for( int i=0; i<m; i++) {
if (x[i] > 35.45295 && x[i] < 83.34705) quant.push_back(x[i]);
}
return wrap(quant) ;
'
R> val.sel.1 <- cxxfunction(signature(xx="numeric", prob="numeric"), plugin='Rcpp', body=src.1)
R> x <- c(77, 95, 16, 54, 63, 93, 44, 88, 25, 39)
R> val.sel.1(x, prob=c(0.2,0.8)) # [1] 77 54 63 44 39
R> src.2 <-'
NumericVector x = xx, p = prob;
int n = p.size() ;
int m = x.size() ;
NumericVector res(n), quant ;
for( int i=0; i<n; i++) res[i] = R::qnorm(p[i], Rcpp::mean(x), Rcpp::sd(x), 1, 0) ;
for( int i=0; i<m; i++) {
if (x[i] > res[1] && x[i] < res[2]) quant.push_back(x[i]);
}
return wrap(quant) ;
'
R> val.sel.2 <- cxxfunction(signature(xx="numeric",prob="numeric"),plugin='Rcpp', body=src.2)
R> val.sel.2(x, prob=c(0.2,0.8)) # numeric(0)
答案 0 :(得分:3)
一些意见:
1)在push_back
容器上使用Rcpp
通常被认为是“不良做法”,因为它会在每次推送时强制执行向量的副本;最好初始化具有给定大小的向量,并根据需要填充它们,使用for循环,迭代器,STL算法......有关如何完成此操作的详细示例,请参阅Rcpp Gallery。 / p>
2)如果您确实想使用push_back
,请考虑使用STL容器,例如:将结果返回给R时输出std::vector<double>
或std::vector<int>
和Rcpp::wrap
。
至于你的实际问题,这是一个简单的错误 - 你使用的是R风格的数组索引而不是C ++风格的数组索引。变化
if (x[i] > res[1] && x[i] < res[2]) quant.push_back(x[i]);
到
if (x[i] > res[0] && x[i] < res[1]) quant.push_back(x[i]);
你会得到预期的结果。