Best way to use c++ code from R package FOO in package BAR

后端 未结 3 734
星月不相逢
星月不相逢 2021-02-06 01:20

I am trying to define a function using Rcpp for speedup. The situation is as follows:

  • I have a package FOO with a lot of C++ code (my own package and currently not
3条回答
  •  时光说笑
    2021-02-06 02:18

    I would recommend one of these options:

    If foo_a and foo_b are simple enough, just have them as inline functions in headers of FOO and put these headers in FOO/inst/include/FOO.h. Rcpp::depends(FOO) will then include this file when you invoke compileAttributes (or perhaps load_all) on BAR.

    Otherwise, consider registering the functions using R's registration model. this is a bit more work, but that's bearable. Writing R extensions has the details. I would suggest putting all the registration logic in FOO so that the client package BAR only has to use it. For example, I'd have foo_a like this in FOO's headers, e.g. in FOO/inst/include/FOO.h:

    #ifdef COMPILING_FOO
    inline int foo_a(int x, double y, const std::string& z){
        typedef int (*Fun)(int, double, const std::string&) ;
        static Fun fun = (Fun)R_GetCCallable( "FOO", "foo_a" ) ;
        return fun(x,y,z) ;
    }
    #else 
    // just declare it
    int foo_a(int x, double y, const std::string& z) ;
    #endif
    

    and the actual definition of foo_a in some .cpp file in FOO/src:

    #define COMPILING_FOO
    #include 
    
    int foo_a(int x, double y, const std::string& z){
       // do stuff
    }
    

    Then, you need to register foo_a using R_RegisterCCallable in the function R_init_FOO:

    extern "C" void R_init_FOO( DllInfo* info ){
        R_RegisterCCallable( "FOO", "foo_a", (DL_FUNC)foo_a );
    }
    

提交回复
热议问题