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

标签 c++ r pipe communication rcpp

我有一个用 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/

相关文章:

c++ - 不能在 cmake_pch.h 中包含标准库

使用 _aligned_malloc() 的 unique_ptr<> 的 C++ 数据对齐

c++ - 未解析的外部符号 __mm256_setr_epi64x

r - 特定的 x 轴/面顺序 ggpubr

sockets - select() + 非阻塞 write() 是否可以在阻塞管道或套接字上实现?

c++ - 编译时大小未知的数组类的实例化

javascript - 单击 R Shiny 后更改操作按钮的 bg 颜色

python - 在 python 中从 R data.table 访问数据的推荐方法是什么?我可以避免将数据写入光盘吗?

c - pipeline() 将结构从子级发送到父级。 read() 中的象形文字;

bash - 为什么 Bash 在与 Curl 一起使用时不会等待读取?