跳过内容

nanoarrow_schemananoarrow_arraynanoarrow_array_stream 类在 R 中表示为外部指针 (EXTPTRSXP)。当这些对象超出作用域时(即,当它们被垃圾回收时或此后不久),如果底层指针非空且 release() 回调非空,则会调用底层对象的 release() 回调。

用法

nanoarrow_pointer_is_valid(ptr)

nanoarrow_pointer_addr_dbl(ptr)

nanoarrow_pointer_addr_chr(ptr)

nanoarrow_pointer_addr_pretty(ptr)

nanoarrow_pointer_release(ptr)

nanoarrow_pointer_move(ptr_src, ptr_dst)

nanoarrow_pointer_export(ptr_src, ptr_dst)

nanoarrow_allocate_schema()

nanoarrow_allocate_array()

nanoarrow_allocate_array_stream()

nanoarrow_pointer_set_protected(ptr_src, protected)

参数

ptr, ptr_src, ptr_dst

指向 struct ArrowSchemastruct ArrowArraystruct ArrowArrayStream 的外部指针。

protected

其作用域必须比 ptr 的作用域更长的对象。这对于数组流很有用,因为至少有两个涉及数组流的规范规定流仅在另一个对象的生命周期内有效(例如,AdbcStatement 或 OGRDataset)。

返回值

  • 如果指针非空且具有非空释放回调,则 nanoarrow_pointer_is_valid() 返回 TRUE。

  • nanoarrow_pointer_addr_dbl()nanoarrow_pointer_addr_chr() 返回指针表示,这可能有助于将 nanoarrow 对象移动或导出到其他库。

  • nanoarrow_pointer_addr_pretty() 提供适合打印或错误消息的指针表示。

  • nanoarrow_pointer_release() 返回 ptr(不可见)。

  • nanoarrow_pointer_move()nanoarrow_pointer_export() 返回 ptr_dst(不可见)。

  • nanoarrow_allocate_array()nanoarrow_allocate_schema()nanoarrow_allocate_array_stream() 分别返回一个数组、一个模式和一个数组流

详情

在与其他 C 数据接口实现交互时,请务必记住,包装这些指针的 R 对象始终通过引用传递(因为它是外部指针),并且可能被另一个 R 对象引用(例如,list() 中的元素或作为用户环境中分配的变量)。将模式、数组或数组流导入 nanoarrow 时,这不是问题:R 对象拥有生命周期,并在 R 对象被垃圾回收时释放内存。在这种情况下,可以使用 nanoarrow_pointer_move(),其中 ptr_dst 是使用 nanoarrow_allocate_*() 创建的。

导出的情况更为复杂,因此有一个专门的函数 nanoarrow_pointer_export(),它为模式、数组和数组流实现了不同的逻辑。

  • 模式对象是(深层)复制的,以便导出模式的新副本并由其他 C 数据接口实现负责。

  • 数组对象作为原始数组的 shell 导出,保留对 R 对象的引用。这确保了数组指向的缓冲区和子对象不会被复制,并且对原始数组的任何引用都不会失效。

  • 数组流对象被移动:对象的责任转移到其他 C 数据接口实现,并且对原始 R 对象的任何引用都失效。由于这些对象是可变的,这通常是您想要的(即,您不应该意外地从两个地方从流中提取数组)。

如果您知道对象的生命周期(即,您自己创建了 R 对象并且从未将引用传递给其他地方),您可以更高效地为所有三种指针类型调用 nanoarrow_pointer_move()