0

我有一个 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。

4

0 回答 0