4

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

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

我正在考虑使用pipe()来执行此操作,并问您这是否可行,或者我应该使用其他方法吗?是否可以使用 rcpp 执行此操作?

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

4

2 回答 2

7

忘了.C。那很笨重。也许在 Rcpp 之前使用.Cover.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
于 2013-10-10T15:28:28.797 回答
1

这里有几个问题。

从 R 调用 C++ 代码的最佳方法是什么?

正如其他评论者指出的那样,该Rcpp软件包提供了最好的界面。也可以使用.Call基础 R 中的函数,但不能推荐的和 Rcpp 一样好。

如何停止在 R 和 C++ 之间反复传递数据?

您只需稍微重构您的代码。用 C++ 重写一个调用所有现有 C++ 例程的包装例程,并从 R 中调用它。

于 2013-10-10T12:02:55.267 回答