函数在RcppArmadillo中通过引用传递

时间:2017-05-18 11:59:09

标签: r rcpp armadillo

我有一个用RcppArmadillo风格编写的函数,我想用它来改变调用环境中的变量。我知道做这样的事情是不可取的,但在我的情况下它会有所帮助。具体来说,我试过这个:

#include <RcppArmadillo.h>
#include <iostream>

//[[Rcpp::export]]
void myfun(double &x){
  arma::mat X = arma::randu<arma::mat>(5,5);
  arma::mat Y = X.t()*X;
  arma::mat R1 = chol(Y);

  x = arma::det(R1);
  std::cout << "Inside myfun: x = " << x << std::endl;
}


/*** R
x = 1.0  // initialize x 
myfun(x) // update x to a new value calculated internally
x        // return the new x; it should be different from 1
*/ 

我错过了什么?为什么不工作?

1 个答案:

答案 0 :(得分:3)

double不是本机R类型(因此始终正在制作副本),并且不能进行传递引用。

相反,请使用Rcpp::NumericVector作为SEXP类型的代理。这有效:

R> sourceCpp("/tmp/so44047145.cpp")

R> x = 1.0  

R> myfun(x) 
Inside myfun: x = 0.0361444

R> x        
[1] 0.0361444
R> 

下面是完整的代码,还有一两个小修:

#include <RcppArmadillo.h>

// [[Rcpp::depends(RcppArmadillo)]]

//[[Rcpp::export]]
void myfun(Rcpp::NumericVector &x){
  arma::mat X = arma::randu<arma::mat>(5,5);
  arma::mat Y = X.t()*X;
  arma::mat R1 = chol(Y);

  x[0] = arma::det(R1);
  Rcpp::Rcout << "Inside myfun: x = " << x << std::endl;
}


/*** R
x = 1.0  // initialize x 
myfun(x) // update x to a new value calculated internally
x        // return the new x; it should be different from 1
*/