2017-05-19 8 views
1

일부 준비된 함수로 내 R 코드를 RcppArmadillo로 번역 중입니다. 이 기능 중 일부를 번역 대신 Rcpp 코드에서 직접 사용하고 싶습니다. 예를 들어, 나는 sigma2 함수를 호출 할 :아르마딜로 데이터 형식의 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 함수를 호출하기 전에 전달 된 특정 값을 얻기 위해 R 함수에 접근 할 수 없습니다.

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

답변 해 주셔서 감사합니다. 이것은 내가 찾고 있었던 바로 그 것이다. – Ham82

+0

"상당한"속도 저하가 아닙니다. 측정 할 수 있도록 레이어를 추가하지만 너무 극적으로 들리게 만듭니다. –