如何解决具有唯一性约束的 R vctrs 子类化
在 R 中,我需要定义一个具有唯一性约束的 vm.showMoreTransactions()
子类。
我可以在这里为这种新的 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
正如@Rui-Barradas 所提议的,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
可以专门化,
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
连接后强制断言唯一性约束吗?
一切顺利,
解决方法
我不确定以下是否是您想要的,我对 vctrs 类的经验(非常)很少。
c.uid <- function(...){
x <- unlist(list(...))
#x <- unique(x)
new_uid(x)
}
c(x,x)
# Error in new_uid(x) : Duplicated id
,
再次查看 vctrs
小插图 S3 向量后,我测试了一个有效的解决方案。
它需要定义一个 vec_restore.uid
方法来断言唯一性,
在传递给 NextMethod
之前通常是默认的:
vec_restore.uid <- function(x,to,...) {
if (anyDuplicated(na.omit(x)) > 0)
stop("Duplicated id")
NextMethod()
}
之后我们得到正确的行为
vec_c(x,x)
Error in vec_restore.uid(x = x,to = to,n = n) : Duplicated id
与
相同c(x,n = n) : Duplicated id
同时
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
继续提供正确答案。
感谢您的帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。