2013-01-08 5 views
1

R 패키지 "RcppArmadillo"로 작업했습니다. 난 이미 (그들은 디버깅되어 사용하기 괜찮)이 cxxfunction을 정의하는 데 사용 :인라인 C++ 본체에서 사용자 지정 R 함수 호출

calc1 <- cxxfunction(signature(A="integer", B="integer"),...) 
calc2 <- cxxfunction(signature(A="integer", K="integer"),...) 

지금은 주요 또 다른 cxxfunction의 신체 부위를 쓰고 있어요 거기 루프의 내 CALC1 및 CALC2를 호출 할 예 :

body_main = ' 

    ... 
    for(int i=0; i<N; i++){ 
     // This is where I want to call calc1. 
     // (?) 
     for(int j=0; j<N; j++){ 
      // This is where I want to call calc2. 
      // (?) 
     } 
    } 

' 

어쨌든 내가 이룰 수 있습니까? 인라인 방식으로 할 수 있습니까?

나는있는 사람들이 신체 부위 내에서 서브 루틴을 쓰기 RcppArmadillo (또는 Rcpp, RcppGSL)의 인라인 사용의 예를 보지 못했다 - 특히, 나는 코드는 다음과 같은 의미 :

body_example = ' 

    // Subroutine 
    SEXP(/*or something else*/) func_0(SEXP A, SEXP B){ 
     ... 
     return ...; 
    } 

    // Then call it from the main part 
    ... 
    AB = func_0(A, B); 
    ... 
' 

내 질문은 아마 순진 해 보이지만 그럼에도 불구하고 그것은 나를 괴롭힌다. 아무도 이것을 설명 할 수 있습니까? 나는 그것을 많이 감사 할 것이다!

답변

1

inline에서 cxxfunction()을 사용하여 Rcpp 속성과 sourceCpp()을 사용할 수 있습니다. 그렇게하면 C++ 수준에서 예측 가능한 함수 헤더를 얻을 수 있습니다. Rcpp의 atributes 비 네트를 참조하십시오.

또는 calc1calc2을 'worker'와 'wrapper'로 나누면 래퍼 주변에 cxxfunction()이 표시되어 작업자를 호출 할 수 있습니다.

여기서 중요한 문제는 R 호출 가능 함수를 만들기 위해 cxxfunction()이 존재하며 내부 임의 화 함수 헤더를 생성한다는 것입니다.

마지막으로 패키지도 도움이됩니다.

+0

많은 감사, 더크! 나는 SourceCpp이 나의 경우를 위해 일해야한다고 생각하지만 - 당신의 지식에 따라, SourceCpp이 Armadillo와 함께 작업 할 수 있습니까? 아니면 say, blas를 사용하여'calc1'과'calc2'를 재 프로그램해야합니까? - 나는'arma :: mat'과 같은 var 타입을 사용하고있었습니다 ... – Clavichord

+0

물론입니다. 방금 시작한 [Rcpp Gallery] (http://gallery.rcpp.org) 사이트에서 Armadillo 예제를 참조하십시오. –

+0

완벽한! 그 사이트는 내가 필요로하는 모든 것을 나에게 명확하게 설명한다. 감사! – Clavichord