0

我是使用 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)
4

1 回答 1

3

一些评论:

1)push_backRcpp容器上使用通常被认为是“不好的做法”,因为它会在每次推送时强制复制一个向量;最好用给定的大小初始化向量,并根据需要填充它们,或者使用 for 循环、迭代器、STL 算法……请参阅Rcpp Gallery以获取有关如何完成的许多好的示例。

2) 如果您真的想使用push_back,请考虑使用 STL 容器,例如std::vector<double>or std::vector<int>,并Rcpp::wrap在将结果返回给 R 时 -ing 输出。

至于你的实际问题,这是一个简单的错误——你使用的是 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]); 

你会得到预期的结果。

于 2013-10-15T18:47:29.280 回答