2017-05-18 58 views
2

我有一個用RcppArmadillo風格編寫的函數,我想用它來改變調用環境中的變量。我知道這樣做並不可取,但對我來說這很有幫助。具體地說,我試着這樣:函數在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 
*/ 

我錯過了什麼?爲什麼不工作?

回答

3

A 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 
*/