2

これは、私がさまざまな状況で経験した問題の再現可能な例です。基本的に、私は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、それはありがたいです。投稿したソリューションが機能する理由を説明できれば、さらに役立ちます。

4

1 に答える 1

4

私はあなたの例が何を意味するのか完全にはわからないことを認めますが、ここにアルマジロタイプを使用した変形があります。入力ベクトルを保持し、で表示しstdoutます。

cpp_src <- '
  arma::ivec sa = Rcpp::as<arma::ivec>(x);
  Rcpp::Rcout << sa << std::endl;
  int currentSum = 12;
  Rcpp::Rcout << sa[0] << " ";
  Rcpp::Rcout << currentSum << " ";
  int remainingQuantity = arma::as_scalar(sa[0]) - currentSum;
  Rcpp::Rcout << remainingQuantity << std::endl;
  return Rcpp::wrap(remainingQuantity);
'

armasumto <- cxxfunction(signature(x="numeric", s="integer"), 
                         body=cpp_src, plugin="RcppArmadillo", verbose=FALSE )

testresult <- armasumto(x=x, s=100L)

それで、私は得ます:

R> cpp_src <- '
+   arma::ivec sa = Rcpp::as<arma::ivec>(x);
+   Rcpp::Rcout << sa << std::endl;
+   int currentSum = 12;
+   Rcpp::Rcout << sa[0] << " ";
+   Rcpp::Rcout << currentSum << " ";
+   int remainingQuantity = arma::as_scalar(sa[0]) - currentSum;
+   Rcpp::Rcout << remainingQuantity << std::endl;
+   return Rcpp::wrap(remainingQuantity);
+ '
R> 
R> armasumto <- cxxfunction(signature(x="numeric", s="integer"), 
+                           body=cpp_src, plugin="RcppArmadillo", verbose=FALSE )
R> testresult <- armasumto(x=x, s=100L)
        29
        79
        41
        86
        91

29 12 17
R> 

完全を期すために、Rcppベクトルと同じように、すべてがスカラー上にあることを確認しました。

R> cpp_src <- '
+   Rcpp::IntegerVector xa(x);
+   int currentSum = 12;
+   Rcpp::Rcout << xa[0] << " ";
+   Rcpp::Rcout << currentSum << " ";
+   int remainingQuantity = xa[0] - currentSum;
+   Rcpp::Rcout << remainingQuantity << std::endl;
+   return Rcpp::wrap(remainingQuantity);
+ '
R> newsumto <- cxxfunction(signature(x="integer", s="integer"), 
+                          body=cpp_src, plugin="Rcpp" )
R> testresult <- newsumto(x=x, s=100L)
29 12 17
R> 
于 2013-02-07T21:57:11.880 に答える