2

问我在RStudio 社区论坛上提出的问题,以防有人能够在这里提供帮助。

大家好,我正在努力更好地理解[<-[[<-vec_cclist_of 类的行为。我正在定义一个list_of子类,它本质上是一个字符向量列表,应该在空格上分割。我想根据需要使用赋值运算符来调整值,但我很难完全理解vctrs实现。我在下面提供了一个代表,突出了我想要弄清楚的内容。

示例类

library(vctrs)
library(stringr)

new_example <- function(x = list()) {
  if (vec_is(x, character())) {
    x <- str_split(x, " ")
  }
  new_list_of(x,
              ptype = character(),
              class = "example")
}

vec_ptype_full.example <- function(x, ...) {
  "example"
}

vec_ptype_abbr.example <- function(x, ...) {
  "xmpl"
}

用于强制和铸造的锅炉板

vec_ptype2.example <- function(x, y, ...) UseMethod("vec_ptype2.example", y)

vec_ptype2.example.default <- function(x, y, ..., x_arg = "x", y_arg = "y") {
  vec_default_ptype2(x, y, x_arg = x_arg, y_arg = y_arg)
}

vec_cast.example <- function(x, to, ...) UseMethod("vec_cast.example")

vec_cast.example.default <- function(x, to, ...) vec_default_cast(x, to)

榜样与性格之间的强制

vec_ptype2.example.character <- function(x, y, ...) x

vec_ptype2.character.example <- function(x, y, ...) y

在例子和角色之间进行转换

vec_cast.character.example <- function(x, to, ...) map_chr(x, str_c, collapse = " ")

vec_cast.example.character <- function(x, to, ...) new_example(x)

vec_cast.example.example <- function(x, to, ...) new_example(x)

测试

a <- new_example("a b")
a
#> <example[1]>
#> [[1]]
#> [1] "a" "b"

# Error
a[2] <- "c d"
#> Error: Can't cast `x` <list_of<character>> to `to` <example>.

# String not split
a[[2]] <- "e f"
a
#> <example[2]>
#> [[1]]
#> [1] "a" "b"
#> 
#> [[2]]
#> [1] "e f"

# String is split
a[[2]] <- c("e", "f")
a
#> <example[2]>
#> [[1]]
#> [1] "a" "b"
#> 
#> [[2]]
#> [1] "e" "f"

# String is split
vec_c(a, "g h")
#> <example[3]>
#> [[1]]
#> [1] "a" "b"
#> 
#> [[2]]
#> [1] "e" "f"
#> 
#> [[3]]
#> [1] "g" "h"
c(a, "g h")
#> <example[3]>
#> [[1]]
#> [1] "a" "b"
#> 
#> [[2]]
#> [1] "e" "f"
#> 
#> [[3]]
#> [1] "g" "h"

为了将值分配给现有行,有没有一种方法可以使用[<-[[<-分配一个完整的字符串,例如"d e"和被拆分,或者是与已经拆分的字符向量一起使用的最佳选择,[[<-例如c("d", "e")

问题的症结在于,使用vec_cand c,新值似乎是通过new_example,因此字符串被拆分。[[<-似乎避免了这种情况,并在发送到构造函数之前[<-将字符串转换为list_of类,但我仍然不清楚如何调整这些细节以在这个用例中工作(并且更好地理解vctrs应该如何工作)。

4

0 回答 0