我正在尝试在R中实现我自己的数组类型,并希望语义与内置数组匹配。为此,我必须能够处理以下呼叫:
my.array(1:9, c(3, 3, 3))
x[1:2, 1, 2]
x[,,3]
我将其实现为:
`[.my.array` <- function(x, ..., drop = TRUE) {
os <- range_to_offset_shape(...)
result <- getindex(x, offset = os$offset, shape = os$shape)
if(drop) result <- handle_drop(result)
return(result)
}
其中
range_to_offset_shape <- function(...) {
i <- list(...)
offset <- sapply(i, function(x) x[1])
shape <- sapply(i, function(x) x[length(x)] - x[1] + 1)
return(list(offset = offset, shape = shape))
}
只要没有遗漏的参数,这就可以很好地工作。为了实现这一点,我必须用1:dim(x)[i]
替换...
中缺失的参数,最好的方法是什么?也欢迎其他解决方案!
这里有一种方法:
#https://stackoverflow.com/a/20906150/1412059
isEmptySymbol <- function(x) is.symbol(x) && identical("", as.character(x))
foo <- function(...) {
i <- as.list(match.call())[-1] #call before evaluation
#replace empty symbols (here with 0 as an example)
i[vapply(i, isEmptySymbol, FUN.VALUE = TRUE)] <- 0
#evaluate all list elements
lapply(i, eval)
}
x <- 2
foo(1, , x)
#[[1]]
#[1] 1
#
#[[2]]
#[1] 0
#
#[[3]]
#[1] 2