微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

具有唯一性约束的 R vctrs 子类化

如何解决具有唯一性约束的 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 举报,一经查实,本站将立刻删除。