你可以使用eval(parse()),像这样:
foo <- function(A, v) {
stopifnot(length(v) == length(dim(A)))
idx <- paste(v, collapse = ", ")
return(eval(parse(text = paste0("A[", idx, "]"))))
}
A <- array(1:(3^3), dim = c(3, 3, 3))
v <- c(1, 2, 3)
foo(A, v)
# [1] 22
A[1, 2, 3]
# [1] 22
更新:作业
在 cmets 中,您还会询问作业;看起来您已经对其进行了排序,但如果您或其他人发现它有用,您可以使用替换功能:
`foo<-` <- function(A, v, value) {
stopifnot(length(v) == length(dim(A)))
stopifnot(is.atomic(value) & length(value) == 1)
idx <- paste(v, collapse = ", ")
eval(parse(text = paste0("A[", idx, "] <- value")))
return(A)
}
foo(A, v) <- 2
foo(A, v)
# [1] 2