在内联C ++主体中调用用户指定的R函数

时间:2013-01-08 18:48:19

标签: r inline armadillo

我一直在使用R包“RcppArmadillo”。我已经用它来定义两个cxx函数(它们已被调试好了):

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

现在我正在编写另一个cxxfunction main的正文部分,并希望在for循环中调用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 个答案:

答案 0 :(得分:1)

您可以使用cxxfunction()从包inline切换到使用Rcpp属性及其sourceCpp()。这样您就可以在C ++级别获得可预测的函数头,请参阅Rcpp atributes vignette。

或者将calc1calc2拆分为'worker'和'wrapper',在包装器周围设置cxxfunction(),允许您呼叫该工作人员。

这里的关键问题是cxxfunction()存在以创建 R-callable 函数,并生成内部随机函数头。

最后,一个包也会有所帮助。