我基本上有两个C函数可供R使用,其中一个是制作一些blob,第二个需要使用它。虽然用户不应该查看它,但我认为不对R类型进行任何序列化/转换并将其转储到RAWSXP是合理的。
这有什么不明显的缺点(即打印时杀死用户的控制台除外)?
编辑:好的,比方说我有一个double / int64 /(4 x int16)联合数组,这是一些算法的结果;我希望它具有正常的R复制语义,从用户的角度自然地表现(因此外部指针不是一个选项)但我不太急于将它序列化为R对象,因为它不会直截了当可能会以巨大的内存开销结束。
答案 0 :(得分:4)
如果blob要在单个R会话中持续存在,那么在C级别创建外部指针并将其返回给用户会更自然。这在编写R扩展,section 5.13中列出。
此方法的一个限制是外部指针不会序列化,因此不会保存到磁盘或例如从并行作业返回。当blob是对数据结构的引用时,这通常是合适的,该数据结构仅在创建它的上下文中有意义(例如,文件句柄),但如果它是静态数据结构则更少。在这种情况下,将数据存储为RAWSXP可能是合适的,通常作为具有打印/显示方法的S3或S4类的插槽或元素,以隐藏用户的血腥细节。也许缺点是RAWSXP由R分配和管理,例如,受垃圾收集,而外部指针的内容可能更直接地通过Calloc
和Free
分配。
答案 1 :(得分:1)