gpt4 book ai didi

c++ - R 和 C++ 之间的通信

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:23:43 32 4
gpt4 key购买 nike

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

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

我正在考虑使用 pipe() 来执行此操作,请问您这是可行的选择还是我应该使用其他方法?可以用 rcpp 做到这一点吗?

我这样做是为了在此函数上测试 R 的最小化算法。

最佳答案

忘掉 .C。那很笨重。也许在 Rcpp 之前使用 .C 而不是 .Call.External 是有意义的。但是现在我们在 Rcpp 中做了很多工作,我真的看不出再使用 .C 有什么意义了。只需使用 .Call

更好的是,有了属性(sourceCppcompileAttributes),您甚至不必再看到 .Call,它只是感觉就像你在使用 C++ 函数。

现在,如果我想做一些保留状态的事情,我会使用模块。例如,您的应用程序是这个 Test 类。它有方法 do_somethingdo_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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com