3

假设我有一个函数,它接受维度为 1 或 2 的参数 x。我想做类似的事情

x[1, i]

无论我得到一个向量还是一个矩阵(或一个或两个变量的表)。

例如:

x = 1:5
x[1,2] # this won't work...

当然,我可以检查哪个类作为参数给出,或者强制参数为矩阵,但我宁愿不这样做。例如,在 Matlab 中,向量除了一个维度之外的所有维度为 1 的矩阵(并且可以被视为行或列等)。这使代码变得漂亮而有规律。

另外,有没有人知道为什么在 R 向量(或一般一维对象)中不是矩阵(或多维对象)的特殊情况?

谢谢

4

1 回答 1

5

在 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

即保持空维度。

使这个万无一失和普及将需要更多的努力,但以上将让你开始。

于 2012-12-11T17:15:14.920 回答