我有一个 vctr_record 类型的对象,我想将它用作我不能/不应该更改的代码的输入。
我遇到的问题是,该代码中的 lapply-then-unlist 行为导致我的 vctr_record 类型对象被展平。但是,这不是我想要的行为,我希望 vctr_record 类型在取消列出后保留。
我知道为什么unlist 不保留属性等,但我希望有人会知道一个不涉及我提交 github 问题的解决方法,该问题可能需要相当长的时间才能解决。
以下是此行为的示例:
library(vctrs)
# Setting up a constructor
facvec <- function(f) {
vec_assert(f, partial_factor())
new_rcrd(fields = list(f = f), class = "facvec")
}
# Setting up how facvec's should be combined
# Based on: https://vctrs.r-lib.org/articles/s3-vector.html
vec_ptype2.facvec <- function(x, y, ...) UseMethod("vec_ptype2.facvec", y)
vec_ptype2.facvec.default <- function(x, y, ..., x_arg = "x", y_arg = "y") {
vec_default_ptype2(x, y, x_arg = x_arg, y_arg = y_arg)
}
vec_ptype2.facvec.facvec <- function(x, y, ...) {
facvec(f = vec_c(field(x, "f"), field(y, "f")))
}
# Just for prettier printing
format.facvec <- function(x) {
field(x, "f")
}
# Some dummy data
a <- facvec(factor(c("a", "b")))
b <- facvec(factor(c("c")))
# The problematic operation
unlist(list(a, b))
#> f1 f2 f
#> a b c
#> Levels: a b c
# What I would like the unlist to return
c(a, b)
#> <facvec[3]>
#> [1] a b c
#> Levels: a b c
由reprex 包(v0.3.0)于 2019 年 12 月 18 日创建
随着更多字段被添加到 vctr_record 类型对象,问题变得更糟。
vctrs 包中是否有一些聪明的技巧可以帮助我解决这个问题?恐怕我真的无法更改其他代码中的 unlist。