我希望在一个不是我的RInside程序中的主要函数的函数中使用c++。调试后,我发现该函数在第一轮中正常工作,我得到了预期的输出,但是当第二次调用时,我的程序停止了,我得到了错误消息"R已经初始化了“。有人能帮我解决这个问题吗?请参阅下面一个简单的例子来澄清这一点。我需要从一个函数( my_func )调用mainR()函数,这个函数也不是主要的函数,我实际上处理的是一个有点复杂的程序,所以my_func也会被多次调用,这使得初始化RInside变得毫无用处。对不起,代码看起来不现实,但我只是想简化和澄清我的问题。
#include <RInside.h> 
void mainR()
{
    RInside R; // create an embedded R instance
    R["txt"] = "Hello, world!\n"; // assign a char* (string) to 'txt'
    R.parseEvalQ("cat(txt)"); // eval the init string, ignoring any returns
}
void my_func()
{
mainR();
mainR();
.
.
}发布于 2021-02-13 16:02:39
看起来(我不是RInside方面的专家),一个应用程序在应用程序生命周期内创建的RInside对象不能超过一个。这与C++的"静态存储持续时间“概念相对应。当在main函数中定义变量时,”自动“(默认)和”静态“持续时间之间的差异通常是微不足道的,但对于一个不止一次调用的函数来说,这是非常重要的。
添加关键字static表示变量具有静态存储持续时间。
static RInside R; // create an embedded R instance这对函数中定义的变量有两个影响。首先,当函数结束时,对象不会被破坏。其次,当函数再次被调用时,对象不会被重新初始化.(当第一次调用该函数时,它仍然被初始化。)这避免了两次初始化R的错误。但是,它也附带了一个警告--对象保留函数调用之间的状态。必须假定RInside对象可能在更早的时候使用过,甚至在mainR()的开头也是如此。
https://stackoverflow.com/questions/66180951
复制相似问题