这里有一些替代方案。它们都可以推广到更高维的数组。
1) 矩阵下标 如果索引都是标量,除了可能是一个,如问题中所示,那么:
mi <- cbind(2:3, 2)
mat[mi]
# test
identical(mat[mi], mat[2:3, 2])
## [1] TRUE
在更高维度:
a <- array(1:24, 2:4)
mi <- cbind(2, 2:3, 3)
a[mi]
# test
identical(a[mi], a[2, 2:3, 3])
## [1] TRUE
可以使用以下方法扩展它以消除标量限制:
L <- list(2:3, 2:3)
array(mat[as.matrix(do.call(expand.grid, L))], lengths(L))
然而,鉴于 (2) 也使用 do.call 但避免了对 expand.grid 的需要,它似乎不必要地复杂。
2) do.call 这种方法没有标量限制。 mat 和 a 来自上方:
L2 <- list(2:3, 1:2)
do.call("[", c(list(mat), L2))
# test
identical(do.call("[", c(list(mat), L2)), mat[2:3, 1:2])
## [1] TRUE
L3 <- list(2, 2:3, 3:4)
do.call("[", c(list(a), L3))
# test
identical(do.call("[", c(list(a), L3)), a[2, 2:3, 3:4])
## [1] TRUE
这可以通过定义变得更漂亮:
`%[%` <- function(x, indexList) do.call("[", c(list(x), indexList))
mat %[% list(2:3, 1:2)
a %[% list(2, 2:3, 3:4)