【问题标题】:Call R functions in RcppArmadillo with armadillo data type使用犰狳数据类型在 RcppArmadillo 中调用 R 函数
【发布时间】:2017-05-20 02:50:18
【问题描述】:

我正在将带有一些准备好的函数的 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.vecw.vec 具有 vec 类型。现在我想知道如何修改此代码以调用sigma2?我需要改变我的环境吗?

【问题讨论】:

    标签: r rcpp armadillo


    【解决方案1】:

    首先,对将 R 函数和环境嵌入到 C++ 例程中说 no。在这种情况下没有加速;只有相当大的减速。此外,如果无法在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
    }
    

    【讨论】:

    • 感谢您的回答。这正是我想要的。
    • 不是“相当大”的减速;它添加了一个图层,因此它可以衡量,但你让它听起来太戏剧化了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多