我正在努力将一些用c ++编写的MCMC软件转换为使用Rcpp和模块的R-package。在这方面,我需要维护一个全局变量指针,并指向构造的某个类的最新对象。
以下是R脚本形式的一个非常简单的示例:
require(Rcpp)
require(inline)
inc <- '
using namespace Rcpp;
class test;
test* glob; //global pointer
class test{
private:
double foo;
public:
test(double foo_) : foo(foo_) {
glob=this; // the line causes segfault
};
double get_foo(){return foo;};
};
RCPP_MODULE(test){
class_<test>("test")
.constructor<double>()
.property("foo",&test::get_foo)
;
}
'
fx <- cxxfunction(signature(),plugin="Rcpp",include=inc);
test_module <- Module("test",getDynLib(fx))
test <- test_module$test
t1 <- new(test,1.0)
我想要的是以下内容(在c ++中):
#include<iostream>
class test;
test* glob;
class test{
private:
double foo;
public:
test(double foo_) : foo(foo_) {glob=this;};
double get_foo(){return foo;};
};
int main(){
test t1(1.0);
test t2(2.0);
std::cout << (*glob).get_foo() << std::endl;
}
编译并按预期运行。
提前致谢, 此致,Tore Kleppe
答案 0 :(得分:2)
这似乎是两个无关且简单的错误。
首先,你需要制作指针static
。事情随后起作用。
其次,使用带有inline的Rcpp模块是否定的 更简单的方式,我们通常建议使用包 - 或Rcpp属性,如下所示。
更正代码,包括在构造函数中向stdout
显式发送消息:
#include <Rcpp.h>
using namespace Rcpp;
class test;
static test* glob = NULL; //global pointer
class test{
private:
double foo;
public:
test(double foo_) : foo(foo_) {
Rcpp::Rcout << "Seeing foo_ of " << foo_ << " in ctor\n";
glob=this; // the line causes segfault
};
double get_foo(){return foo;};
};
RCPP_MODULE(test){
class_<test>("test")
.constructor<double>()
.property("foo",&test::get_foo)
;
}
然后从命令行中简单使用(使用littler; R或Rscript是等效的):
$ r -lRcpp -e 'sourceCpp("/tmp/tore.cpp"); tt <- new(test, 1.23); print(tt$foo)'
Seeing foo_ of 1.23 in ctor
[1] 1.23
$
请注意我们如何跳过所有模块实例化等。