Gum*_*meo 4 c++ communication r pipe rcpp
我有一个用C++编写的程序,它计算似然函数的值,它依赖于大量数据.我希望能够从R调用函数来请求函数值(计算将花费很多时间在R中,并且C++程序已经很长时间来改变它,它大约是150K行代码).
我可以这样做来请求一个值,但随后C++应用程序终止,我必须重新启动它并再次加载所有数据,(这样做.c()).加载需要10-30秒,具体取决于似然函数和数据的模型,我在想是否有办法让C++应用程序保持活动状态,等待函数值的请求,所以我没有将所有数据读回内存.已经在C++应用程序中计算一个函数值需要大约半秒钟,这对于C++来说非常长.
我正在考虑使用pipe()这个,并问你这是否是一个可行的选择,还是我应该使用其他方法?用rcpp可以做到这一点吗?
我这样做是为了测试这个函数上R的最小化算法.
忘掉了.C.那很笨重.也许在Rcpp之前使用.C过度.Call或.External有意义.但是现在我们已经完成了工作Rcpp,我真的没有看到使用的重点.C了.只是用.Call.
更好的是,使用属性(sourceCpp和compileAttributes),您甚至不必再看到.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)