重新定义矩阵的%in%

jos*_*ber 5 r matrix

我喜欢能够跨矩阵元素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
Run Code Online (Sandbox Code Playgroud)

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

m %in% c(2, 3)
# [1] FALSE  TRUE  TRUE FALSE
Run Code Online (Sandbox Code Playgroud)

注意到这%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
}
Run Code Online (Sandbox Code Playgroud)

虽然如果我明确调用它确实有效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
Run Code Online (Sandbox Code Playgroud)

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