nanoarrow_schema
、nanoarrow_array
和 nanoarrow_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)
值
如果指標為非空值且具有非空值的 release 回呼,則
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()
分別傳回 array、schema 和 array stream。
詳細資訊
當與其他 C Data Interface 實作互動時,務必記住,包裝這些指標的 R 物件始終以傳參考方式傳遞(因為它是外部指標),並且可能被另一個 R 物件引用(例如,list()
中的元素或使用者環境中指定的變數)。當將 schema、array 或 array stream 匯入 nanoarrow 時,這不是問題:R 物件取得生命週期的所有權,並且在 R 物件被垃圾回收時釋放記憶體。在這種情況下,可以使用 nanoarrow_pointer_move()
,其中 ptr_dst
是使用 nanoarrow_allocate_*()
建立的。
匯出的情況更複雜,因此有一個專用的函式 nanoarrow_pointer_export()
,它實作不同的邏輯 schema、array 和 array stream
Schema 物件會被(深度)複製,以便匯出 schema 的全新副本,並使其成為其他 C data interface 實作的責任。
Array 物件會作為原始 array 周圍的外殼匯出,該外殼保留對 R 物件的引用。這確保了 array 指向的緩衝區和子物件不會被複製,並且對原始 array 的任何引用都不會失效。
Array stream 物件會被移動:物件的責任被轉移到其他 C data interface 實作,並且對原始 R 物件的任何引用都將失效。由於這些物件是可變的,因此這通常是您想要的(即,您不應意外地從兩個地方從串流中提取 array)。
如果您知道物件的生命週期(即,您自己建立了 R 物件,並且從未將其引用傳遞到其他地方),則可以更有效率地為所有三種指標類型呼叫 nanoarrow_pointer_move()
。