我喜欢能够跨矩阵元素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%返回矩阵?