2017-05-19 95 views
1

我正在將一些準備好的函數的R代碼翻譯爲RcppArmadillo。我想直接在我的Rcpp代碼中使用其中的一些功能,而不是翻譯。例如,我要調用的函數sigma2使用armadillo數據類型在RcppArmadillo中調用R函數

sigma2<- function(xi.vec,w.vec,log10lambda,n,q){ 
    lambda <- 10^log10lambda 
    (1/(n-q))*sum((lambda*xi.vec*(w.vec^2))/(lambda*xi.vec+1)) 
} 

典型RCPP代碼如下:

#include <RcppArmadillo.h> 
// [[Rcpp::depends(RcppArmadillo)]] 


// [[Rcpp::export]] 
SEXP myS(){ 

    Rcpp::Environment myEnv = Rcpp::Environment::global_env(); 
    Rcpp::Function myS = myEnv["sigma2"]; 
    arma::vec xvec = myEnv["xi.vec"]; 
    arma::vec wvec = myEnv["w.vec"]; 
    double l = myEnv["log10lambda"]; 
    int n = myEnv["n"]; 
    int q = myEnv["q"]; 

    return myS(Rcpp::Named("xi.vec",xvec), 
      Rcpp::Named("w.vec",wvec), 
      Rcpp::Named("l",l), 
      Rcpp::Named("n",n), 
      Rcpp::Named("q",q)); 
} 

當然它的工作原理。但我的問題是,在我的情況下,sigma2函數的參數應該作爲RcppArmadillo中另一個函數(比如func1)的輸出定義,並且它們具有犰狳數據類型。例如,xi.vecw.vecvec類型。現在我想知道如何修改此代碼以致電sigma2?我需要改變我的環境嗎?

回答

2

首先,只要說將R函數和環境嵌入到C++例程中。在這種情況下有沒有加速;只有相當可觀的放緩。此外,如果在global.env範圍內無法檢索到變量,事情就會變得更糟。


在你的情況,你似乎在呼籲從myS()myS()沒有終止條件。因此,您的功能永遠不會結束

例如

SEXP myS(){ 

Rcpp::Function myS = myEnv["sigma2"]; 

return myS(Rcpp::Named("xi.vec",xvec), 
      Rcpp::Named("w.vec",wvec), 
      Rcpp::Named("l",l), 
      Rcpp::Named("n",n), 
      Rcpp::Named("q",q)); 
} 

開關一個是myS_RmyS_cpp


關於環境劫持,您需要傳遞給C++這些值。在調用之前,您無法使用R函數獲取傳遞給它的值。

例如

SEXP myS_cpp(arma::vec xvec, arma::vec wvec, double l, int n, int q){ 
    // code here 
} 
+0

感謝您的回答。這正是我所期待的。 – Ham82

+0

不是「相當」的放緩;它增加了一個可測量的圖層,但會讓它看起來太戲劇化。 –