最常见的 R 向量类型会自动转换为合适的 Arrow 数据类型,无需扩展类型。对于默认情况下转换处理不当的向量类型,您可以创建一个 vctrs_extension_array()
,它将 vctrs::vec_data()
传递给 Array$create()
,并在 Array 转换回 R 向量时调用 vctrs::vec_restore()
。
用法
vctrs_extension_array(x, ptype = vctrs::vec_ptype(x), storage_type = NULL)
vctrs_extension_type(x, storage_type = infer_type(vctrs::vec_data(x)))
参数
- x
一个 vctr(即,
vctrs::vec_is()
返回TRUE
)。- ptype
一个
vctrs::vec_ptype()
,通常是具有适当属性设置的对象的零长度版本。此值将使用serialize()
进行序列化,因此它不应引用任何无法保存/重新加载的 R 对象。- storage_type
底层存储数组的 数据类型。
返回值
vctrs_extension_array()
返回一个具有vctrs_extension_type()
的 ExtensionArray 实例。vctrs_extension_type()
返回扩展名称为“arrow.r.vctrs”的 ExtensionType 实例。
示例
(array <- vctrs_extension_array(as.POSIXlt("2022-01-02 03:45", tz = "UTC")))
#> ExtensionArray
#> <POSIXlt of length 0>
#> -- is_valid: all not null
#> -- child 0 type: double
#> [
#> 0
#> ]
#> -- child 1 type: int32
#> [
#> 45
#> ]
#> -- child 2 type: int32
#> [
#> 3
#> ]
#> -- child 3 type: int32
#> [
#> 2
#> ]
#> -- child 4 type: int32
#> [
#> 0
#> ]
#> -- child 5 type: int32
#> [
#> 122
#> ]
#> -- child 6 type: int32
#> [
#> 0
#> ]
#> -- child 7 type: int32
#> [
#> 1
#> ]
#> -- child 8 type: int32
#> [
#> 0
#> ]
#> -- child 9 type: string
#> [
#> "UTC"
#> ]
#> -- child 10 type: int32
#> [
#> 0
#> ]
array$type
#> VctrsExtensionType
#> POSIXlt of length 0
as.vector(array)
#> [1] "2022-01-02 03:45:00 UTC"
temp_feather <- tempfile()
write_feather(arrow_table(col = array), temp_feather)
read_feather(temp_feather)
#> # A tibble: 1 x 1
#> col
#> <dttm>
#> 1 2022-01-02 03:45:00
unlink(temp_feather)