我想编写一个函数,它将具有可变维数(例如dim(X) => c(2,3)
或dim(X) => c(2,3,5)
)的数组X作为输入,以及维度索引列表和数字指数。该函数根据指定的维度和索引返回数组的子集。例如:
dim(B) => c(2,5,10)
FUN(B, list(list(2,1:3), list(3,6:10))) => B[, 1:3, 6:10]
挑战来自B的尺寸未事先指定的事实。我能想出的最佳解决方案是生成一个字符串s <- "B[,1:3, 6:10]"
(详细信息省略并且不重要),然后发出一个eval(parse(text = s))。我不认为这是一个优雅的解决方案,也可能不是一个有效的解决方案。我想知道是否有人能想出一个简单的方法。
答案 0 :(得分:1)
这是 similar to this earlier question 。一般策略是为所有维度生成索引列表,其中非指定维度由单个TRUE
表示,然后允许您使用[
调用do.call
:
sub_arr <- function(X, lst) {
dim.list <- as.list(rep(T, length(dim(X))))
dim.list[vapply(lst, `[[`, 1, 1)] <- lapply(lst, `[[`, 2)
do.call(`[`, c(list(X), dim.list))
}
B <- array(1:16, dim=rep(2, 4))
sub_arr(B, list(list(2, 1:2), list(3, 1)))
产地:
, , 1
[,1] [,2]
[1,] 1 3
[2,] 2 4
, , 2
[,1] [,2]
[1,] 9 11
[2,] 10 12
和
identical(
B[, 1:2, 1, ],
sub_arr(B, list(list(2, 1:2), list(3, 1)))
)
# [1] TRUE