gpt4 book ai didi

重新定义矩阵的 %in%

转载 作者:行者123 更新时间:2023-12-03 02:31:44 25 4
gpt4 key购买 nike

我喜欢能够使用 ==| 等运算符在 R 中跨矩阵元素进行操作:

(m <- matrix(1:4, nrow=2))
# [,1] [,2]
# [1,] 1 3
# [2,] 2 4

m == 2 | m == 3
# [,1] [,2]
# [1,] FALSE TRUE
# [2,] TRUE FALSE

不幸的是,%in% 没有同样好的行为,并且返回一个向量而不是矩阵:

m %in% c(2, 3)
# [1] FALSE TRUE TRUE FALSE

注意到 %in% 被定义为 function(x, table) match(x, table, nomatch = 0L) > 0L,我想我可以重新定义 match 以获得我想要的行为:

match <- function(x, table, nomatch = NA_integer_, incomparables = NULL) {
m <- base:::match(x, table, nomatch, incomparables)
if (is.matrix(x)) matrix(m, nrow(x))
else m
}

虽然如果我显式调用 match,这确实有效,但在运行 m %in% c(2, 3) 时,我仍然没有得到所需的结果:

match(m, c(2, 3), nomatch=0L) > 0L
# [,1] [,2]
# [1,] FALSE TRUE
# [2,] TRUE FALSE
m %in% c(2, 3)
# [1] FALSE TRUE TRUE FALSE

为什么 %in% 现在不返回矩阵?

最佳答案

我不确定为什么您的尝试不起作用,但我想 %in% 将使用 base:::match 无论您重新定义的 匹配。但为什么不重新定义 %in% 本身呢?

`%in%` <- function(x, table) {
m <- base::match(x, table, nomatch = 0L) > 0L
if (is.matrix(x)) matrix(m, nrow(x))
else m
}

m <- matrix(1:4, nrow=2)

m %in% c(2, 3)

# [,1] [,2]
# [1,] FALSE TRUE
# [2,] TRUE FALSE

正如评论中所建议的,并且通常就良好实践而言,使用不同的名称会更安全,例如 %inm%%min%

关于重新定义矩阵的 %in%,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31484527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com