2013-10-15 2 views
0

Je suis débutant dans l'utilisation de Rcpp et je veux obtenir une sélection plus rapide des valeurs des vecteurs après le calcul des quantiles. Dans l'exemple ci-dessous, il fonctionne bien lorsque les limites inférieures et supérieures
calculées par la fonction qnorm sont entrées manuellement (fonction val.sel.1). Cependant, lorsque ces limites proviennent d'un calcul préalable, aucun vecteur résultant n'est obtenu (fonction val.sel.2). Je me demande ce qui ne va pas dans l'utilisation des arguments. Merci d'avance pour toute aide. AlainRcpp: utilisation pratique des comparateurs

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

Je suis désolé mais je ne comprends pas votre question. –

Répondre

3

Quelques commentaires:

1) Utilisation push_back est généralement considéré sur Rcpp conteneurs « mauvaise pratique », car il force une copie du vecteur à chaque poussée; il est préférable d'initialiser le vecteur avec une taille donnée, et de les remplir au besoin, soit avec des boucles for, des itérateurs, des algorithmes STL ... Voir le Rcpp Gallery pour beaucoup de bons exemples sur la façon dont cela est fait.

2) Si vous voulez vraiment utiliser push_back, pensez à utiliser les conteneurs STL, par ex. std::vector<double> ou std::vector<int> et Rcpp::wrap -ment la sortie lors du retour du résultat à R.

En ce qui concerne votre problème réel, il est une simple erreur - que vous utilisez l'indexation de tableau de style R plutôt que l'indexation de tableau de style C++. Changer

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]); 

et vous obtiendrez le résultat escompté.

+0

Votre avis est très utile. Merci. Alain –

Questions connexes