如何在非主函数的函数中初始化 "RInside" 实例,并多次调用它而没有得到 "R is already initialized"?
How to initialize "RInside" instance in a function NOT main function, and call it multiple times without getting "R is already initialized"?
我想在我的 C++ 程序中不是主要函数的函数中使用 RInside。调试后,我发现该函数在第一轮有效,我得到了预期的输出,但当它第二次被调用时,我的程序停止了,我收到错误消息“R 已初始化”。谁能帮我解决这个问题?
请看下面的一个简单示例来阐明这一点。
我需要从一个函数 (my_func) 调用 mainR() 函数,该函数也不是主要的 function.I 我实际上正在处理一个有点复杂的程序,所以 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();
.
.
}
似乎(我不是 RInside 方面的专家)一个应用程序在其生命周期内创建的对象不能超过一个 RInside
。这对应于C++的概念“static storage duration”。当在main
函数中定义变量时,“自动”(默认)和“静态”持续时间之间的差异通常是微不足道的,但对于多次调用的函数来说却非常重要。
添加关键字static
表示变量为静态存储期
static RInside R; // create an embedded R instance
这对函数内部定义的变量有两个影响。首先,函数结束时对象不会被销毁。其次,再次调用该函数时,对象不会重新初始化。 (第一次调用函数时还是初始化了。)这样就避免了R被初始化两次的错误。然而,它也有一个警告——对象在函数调用之间保留状态。必须假设 RInside
对象可能更早使用过,甚至在 mainR()
.
的开头
我想在我的 C++ 程序中不是主要函数的函数中使用 RInside。调试后,我发现该函数在第一轮有效,我得到了预期的输出,但当它第二次被调用时,我的程序停止了,我收到错误消息“R 已初始化”。谁能帮我解决这个问题? 请看下面的一个简单示例来阐明这一点。 我需要从一个函数 (my_func) 调用 mainR() 函数,该函数也不是主要的 function.I 我实际上正在处理一个有点复杂的程序,所以 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();
.
.
}
似乎(我不是 RInside 方面的专家)一个应用程序在其生命周期内创建的对象不能超过一个 RInside
。这对应于C++的概念“static storage duration”。当在main
函数中定义变量时,“自动”(默认)和“静态”持续时间之间的差异通常是微不足道的,但对于多次调用的函数来说却非常重要。
添加关键字static
表示变量为静态存储期
static RInside R; // create an embedded R instance
这对函数内部定义的变量有两个影响。首先,函数结束时对象不会被销毁。其次,再次调用该函数时,对象不会重新初始化。 (第一次调用函数时还是初始化了。)这样就避免了R被初始化两次的错误。然而,它也有一个警告——对象在函数调用之间保留状态。必须假设 RInside
对象可能更早使用过,甚至在 mainR()
.