これは、私がさまざまな状況で経験した問題の再現可能な例です。基本的に、私はC ++int
とRcppを持っており、IntegerVector
ある整数を別の整数に追加して、それを新しいに格納したいと思いIntegerVector
ます。数値型でも同じ問題が発生しますが、とりあえず整数のままにしておきましょう。
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)
そして、ここに(悲惨な!)結果があります:
> 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
問題の根本は、私がC ++の初心者であり、C変数型をはるかに超えるものに対する優れたメンタルモデルを持っていないことだと思います(つまり、ポインター、参照、および機能レベルでの間接参照を理解していますが、私は間接参照IntegerVector
が一部の場所では機能するが他の場所では機能しないように見える理由や、どのデータ型std::accumulate
が返されるかなど)がわかりません。
とにかく、誰かが私に追加int
する方法のイディオムを教えてくれたらRcpp::IntegerVectors
、それはありがたいです。投稿したソリューションが機能する理由を説明できれば、さらに役立ちます。