R和C++之间的通信

Gum*_*meo 4 c++ communication r pipe rcpp

我有一个用C++编写的程序,它计算似然函数的值,它依赖于大量数据.我希望能够从R调用函数来请求函数值(计算将花费很多时间在R中,并且C++程序已经很长时间来改变它,它大约是150K行代码).

我可以这样做来请求一个值,但随后C++应用程序终止,我必须重新启动它并再次加载所有数据,(这样做.c()).加载需要10-30秒,具体取决于似然函数和数据的模型,我在想是否有办法让C++应用程序保持活动状态,等待函数值的请求,所以我没有将所有数据读回内存.已经在C++应用程序中计算一个函数值需要大约半秒钟,这对于C++来说非常长.

我正在考虑使用pipe()这个,并问你这是否是一个可行的选择,还是我应该使用其他方法?用rcpp可以做到这一点吗?

我这样做是为了测试这个函数上R的最小化算法.

Rom*_*ois 7

忘掉了.C.那很笨重.也许在Rcpp之前使用.C过度.Call.External有意义.但是现在我们已经完成了工作Rcpp,我真的没有看到使用的重点.C了.只是用.Call.

更好的是,使用属性(sourceCppcompileAttributes),您甚至不必再看到.Call它,只是觉得您正在使用c ++函数.

现在,如果我想做一些保留状态的东西,我会使用一个模块.例如,您的应用程序就是这个Test类.它有方法do_something,do_something_else它计算这些方法的使用次数:

#include <Rcpp.h>
using namespace Rcpp ;

class Test {
public:
    Test(): count(0){}

    void do_something(){
        // do whatever
        count++ ;
    }
    void do_something_else(){
        // do whatever
        count++ ;
    }

    int get_count(){
        return count ;
    }

private:
    int count ; 
} ;
Run Code Online (Sandbox Code Playgroud)

到目前为止,这是非常标准的C++.现在,为了使R可用,您可以创建一个这样的模块:

RCPP_MODULE(test){
    class_<Test>( "Test" )
        .constructor()
        .method( "do_something", &Test::do_something )
        .method( "do_something_else", &Test::do_something_else )

        .property( "count", &Test::get_count )
    ;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用它:

app <- new( Test )
app$count
app$do_something()
app$do_something()
app$do_something_else()
app$count
Run Code Online (Sandbox Code Playgroud)