我有一个用 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 ;
} ;
到目前为止,这是非常标准的 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 )
;
}
然后你就可以使用它了:
app <- new( Test )
app$count
app$do_something()
app$do_something()
app$do_something_else()
app$count
关于c++ - R 和 C++ 之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19294043/