Voici un exemple reproductible d'un problème que j'ai rencontré dans divers contextes. En gros, j'ai un programme C++ int
et un Rcpp IntegerVector
et j'aimerais simplement ajouter un entier à un autre et le stocker dans un nouveau IntegerVector
. Le même problème se pose avec les types numériques, mais restons-en aux entiers pour l'instant.
library(inline)
set.seed(123)
x <- sample(1:100,5)
cpp_src <- '
Rcpp::IntegerVector xa = clone(x);
Rcpp::IntegerVector sa(s);
int currentSum = 12;
std::cout << sa[0] << " ";
std::cout << currentSum << " ";
Rcpp::IntegerVector remainingQuantity = sa[0] - currentSum;
std::cout << remainingQuantity << "\\n";
return remainingQuantity;
'
sumto <- cxxfunction( signature(x="integer", s="integer"), body=cpp_src, plugin="Rcpp", verbose=TRUE )
testresult <- sumto(x=x, s=100L)
Et voici les résultats (désastreux !) :
> testresult <- sumto(x=x, s=100L)
100 12 0x50ebf50
> x
[1] 29 79 41 86 91
> testresult
[1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[63] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
> length(testresult)
[1] 88
Je soupçonne qu'à la racine du problème, je suis un débutant en C++ et que je n'ai tout simplement pas un bon modèle mental pour tout ce qui dépasse les types de variables C (c'est-à-dire que je comprends les pointeurs, les références et le déréférencement à un niveau fonctionnel, mais je n'ai aucune idée de la raison pour laquelle le déréférencement d'un IntegerVector
semble fonctionner à certains endroits mais pas à d'autres, ou quel type de données std::accumulate
retours, etc.).
Quoi qu'il en soit, si quelqu'un pouvait me donner un idiome sur la façon d'ajouter int
a Rcpp::IntegerVectors
nous vous en serions reconnaissants. Il serait encore plus utile que vous expliquiez pourquoi la solution que vous avez postée fonctionne.