68 lines
1.7 KiB
R
68 lines
1.7 KiB
R
|
#' Slice index selection
|
||
|
#'
|
||
|
#' @examples
|
||
|
#' # Exquivalent to
|
||
|
#' array(A[slice.index(A, mode) == index], dim = dim(A)[-mode])
|
||
|
#'
|
||
|
#' @export
|
||
|
slice.select <- function(A, mode, index) {
|
||
|
arg <- rep("", length(dim(A)))
|
||
|
arg[mode] <- "i"
|
||
|
expr <- str2lang(paste0("A[", paste0(arg, collapse = ","), "]", collapse = ""))
|
||
|
slice <- eval(expr, list(i = index))
|
||
|
dim(slice) <- dim(A)[-mode]
|
||
|
slice
|
||
|
}
|
||
|
|
||
|
#'
|
||
|
#' @export
|
||
|
slice.expr <- function(A, mode, index = "i", drop = TRUE, nr.axis = length(dim(A))) {
|
||
|
str <- as.character(substitute(A))
|
||
|
arg <- rep("", nr.axis)
|
||
|
arg[mode] <- as.character(substitute(index))
|
||
|
str2lang(paste0(str, "[", paste0(arg, collapse = ","),
|
||
|
if (drop) "]" else ",drop=FALSE]", collapse = ""))
|
||
|
}
|
||
|
|
||
|
|
||
|
#' @export
|
||
|
slice.assign.expr <- function(obj, nr.axis) {
|
||
|
assign.call <- as.call(c(
|
||
|
list(`[<-`, substitute(obj)),
|
||
|
rep(list(alist(a = )$a), nr.axis - 1L), # replicate empty symbol
|
||
|
substitute(index), substitute(x)
|
||
|
))
|
||
|
function(i, val) {
|
||
|
eval(assign.call, envir = list(index = i, x = val))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
# n <- 1000
|
||
|
# p <- c(2, 4, 3)
|
||
|
# A <- array(seq_len(prod(n, p)), dim = c(p, n))
|
||
|
|
||
|
# mode <- 4
|
||
|
# index <- 7
|
||
|
|
||
|
# stopifnot(all.equal(
|
||
|
# A[, , , index],
|
||
|
# array(A[slice.index(A, mode) == index], dim = dim(A)[-mode])
|
||
|
# ))
|
||
|
# stopifnot(all.equal(
|
||
|
# A[, , , index],
|
||
|
# slice.select(A, mode, index)
|
||
|
# ))
|
||
|
|
||
|
# arg <- rep("", length(dim(A)))
|
||
|
# arg[mode] <- "i"
|
||
|
# `A[..., i]` <- str2lang(paste0("A[", paste0(arg, collapse = ","), "]", collapse = ""))
|
||
|
|
||
|
# microbenchmark::microbenchmark(
|
||
|
# A[, , , index],
|
||
|
# eval(`A[..., i]`, list(i = index)),
|
||
|
# slice.select(A, mode, index),
|
||
|
# array(A[slice.index(A, mode) == index], dim = dim(A)[-mode])
|
||
|
# )
|
||
|
|