我需要将 R 表达式保存到文件中,本质上
save( x, file="myfile.Rdata")
但是,我需要从 C/C++ API 执行此操作(因为“x”的值是由 C++ 函数计算的,该函数作为 R 的插件加载)。在网上研究了这个问题后,没有找到任何有用的东西,我深入研究了代码,发现 src/main/saveload.c 中有一个函数“do_save”
SEXP attribute_hidden do_save(SEXP call, SEXP op, SEXP args, SEXP env)
当我在 R 中输入“save”时,这就是 .Internal 完成所有工作,但显然我无法将生成的插件正确链接到 R,我收到错误消息:
> dyn.load( "Plugin.so" )
Error in dyn.load("new-plugin/Plugin.so") :
unable to load shared object 'Plugin.so':
Plugin.so: undefined symbol: _Z7do_saveP7SEXPRECS0_S0_S0_
一般来说,应该如何在 C API 中使用这些内部函数,或者换句话说,应该如何从 C API 评估内置 R 函数?
最佳答案
当您编写 C++ 函数时,二进制文件中的函数名称会发生更改或“损坏”,以允许函数重载起作用。为了避免这种情况,您可以使用 extern "C"
,如果您没有真正使用任何 C++ 特定语法或功能,则可以使用 C 编译器。
对于第一个修复,它会像这样,
extern "C" SEXP attribute_hidden do_save(SEXP call, SEXP op, SEXP args, SEXP env);
第二个可能的修复方法是重命名源文件以具有 .c 扩展名并使用 C 编译器进行编译,如果它不是 C++ 代码,它将编译并且您不需要 extern “C”
。
关于c++ - 如何从 C API 保存 R 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45604513/