在 R 中,我需要定义一个vctrs
具有唯一性约束的子类。uid
我可以在这里为这种新的向量类型提出一个最小的代码。
library(vctrs)
new_uid <- function(x) {
if (anyDuplicated(x) > 0) stop("Duplicated id")
new_vctr(x,class="uid")
}
uid <- function(length=0) {
new_uid(0:(length-1))
}
vec_type2.uid.uid <- function(x,y, ...) uid()
vec_type2.uid.uid <- function(x, to, ...) x
我可以创建那种类型的向量
x <- new_uid(1:10)
y <- new_uid(11:20)
如果我有重复的值,则会产生错误
z <- new_uid(c(1:10,2))
Error in new_uid(c(1:10, 2)) : Duplicated id
串联起作用并产生更长的uid
向量
vec_c(x,y)
<uid[20]>
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
但如果它创建重复项,则不会断言约束,因此不会引发错误。
vec_c(x,x)
<uid[20]>
[1] 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10
正如@Rui-Barradas 建议的那样,base::c
可以专门化,
c.uid <- function(...){
x <- unlist(list(...))
#x <- unique(x)
new_uid(x)
}
c(x, x)
# Error in new_uid(x) : Duplicated id
但这不会影响...vctrs::vec_c()
使用的功能tibble
我可以定义一些东西来强制在使用连接后断言唯一性约束vec_c
吗?
一切顺利,