假设我有一个函数,它采用维数为1或2的参数x.我想做类似的事情
x[1, i]
Run Code Online (Sandbox Code Playgroud)
无论我是否有一个向量或矩阵(或一个变量的表,或两个).
例如:
x = 1:5
x[1,2] # this won't work...
Run Code Online (Sandbox Code Playgroud)
当然,我可以检查哪个类作为参数给出,或者强制参数为矩阵,但我宁愿不这样做.例如,在Matlab中,向量是具有除1维大小之外的所有矩阵的矩阵(并且可以被视为行或列等).这使代码变得美观而且规则.
另外,有没有人知道为什么R向量(或一般的一维对象)不是矩阵(或多维对象)的特殊情况?
谢谢
在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"
Run Code Online (Sandbox Code Playgroud)
接下来,您需要在子集化时保持尺寸; 默认情况下,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
Run Code Online (Sandbox Code Playgroud)
您可以在矩阵中添加一个类,并为默认设置[参数的类编写方法dropFALSE
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]
}
Run Code Online (Sandbox Code Playgroud)
在使用中给出:
> vm[, 2:4]
[,1] [,2] [,3]
[1,] 2 3 4
Run Code Online (Sandbox Code Playgroud)
即维持空的维度.
使这种万无一失和普及需要更多努力,但上述内容将帮助您入门.