这是我在各种情况下遇到的问题的可复制示例。基本上,我有一个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
的习惯,将不胜感激。如果您可以解释您发布的任何解决方案为何有效,则可能会更加有用。 最佳答案
我承认我不确定您的示例将要做什么,但这是使用Armadillo类型的变体。我保留了您的输入 vector ,并在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 vector 相同:
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>