在 R 中,情况正好相反;矩阵是向量。类似矩阵的行为来自对象的原子向量部分顶部的一些额外属性。
要获得您想要的行为,您需要通过使用dim()
或显式强制在向量上设置维度来使向量成为矩阵。
> vm <- 1:5
> dim(vm) <- c(1,5)
> vm
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
> class(vm)
[1] "matrix"
接下来,您需要在子集时保持尺寸;默认情况下,R 将删除空维度,在vm
上面的情况下是行维度。您可以drop = FALSE
在调用'['()
. 默认情况下的行为是drop = TRUE
:
> vm[, 2:4]
[1] 2 3 4
> vm[, 2:4, drop = FALSE]
[,1] [,2] [,3]
[1,] 2 3 4
您可以在矩阵中添加一个类,并[
为该类编写方法,其中参数默认drop
设置为FALSE
class(vm) <- c("foo", class(vm))
`[.foo` <- function(x, i, j, ..., drop = FALSE) {
clx <- class(x)
class(x) <- clx[clx != "foo"]
x[i, j, ..., drop = drop]
}
在使用中给出:
> vm[, 2:4]
[,1] [,2] [,3]
[1,] 2 3 4
即保持空维度。
使这个万无一失和普及将需要更多的努力,但以上将让你开始。