问我在RStudio 社区论坛上提出的问题,以防有人能够在这里提供帮助。
大家好,我正在努力更好地理解[<-
、[[<-
、vec_c
和c
list_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_c
and c
,新值似乎是通过new_example
,因此字符串被拆分。[[<-
似乎避免了这种情况,并在发送到构造函数之前[<-
将字符串转换为list_of
类,但我仍然不清楚如何调整这些细节以在这个用例中工作(并且更好地理解vctrs
应该如何工作)。