我正在使用一些准备好的函数将我的R代码翻译成RcppArmadillo。我想直接在我的Rcpp代码中使用其中一些函数,而不是翻译。例如,我想调用sigma2
函数:
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.vec
和w.vec
具有vec
类型。现在我想知道如何修改此代码以调用sigma2
?我需要改变我的环境吗?
答案 0 :(得分:2)
首先,只需说 no 就可以将R函数和环境嵌入到C ++例程中。在这种情况下,没有加速;只有相当大的减速。此外,如果无法在global.env
范围内检索变量,那么事物就有更大的可能性。
在您的情况下,您似乎在myS()
内调用myS()
而没有终止条件。因此,您的功能永远不会结束。
e.g。
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_R
和myS_cpp
。
关于环境劫持,您需要向下传递给C ++值。您无法访问R函数以获取在调用之前传递给它的特定值。
e.g。
SEXP myS_cpp(arma::vec xvec, arma::vec wvec, double l, int n, int q){
// code here
}