我需要为我的数据结构类创建一个静态数组,我选择用R而不是java编写代码。
如何创建静态数组?我试过了
> array <- array(1:10, dim=c(1,10))
> array
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 2 3 4 5 6 7 8 9 10
但我仍然可以为数组添加第11个值
> array[11] <- 11
> array
[1] 1 2 3 4 5 6 7 8 9 10 11
如何防止这种情况发生?
答案 0 :(得分:2)
我也不知道实现这一目标的机制。但是下面的内容可能会让您了解如何实现静态数组。
我将一个类static_vector
分配给一个向量,如下所示:
x <- 1:10
class(x) <- "static_vector"
接下来,我为此类的assingment运算符[<-
定义一个新方法:
"[<-.static_vector" <- function(x, i, value) {
if (any(i > length(x))) {
warning("Size of vector can not be changed!")
} else {
class(x) <- NULL
x[i] <- value
class(x) <- "static_vector"
}
return (x)
}
编辑:根据nicola的评论,我在函数体的第一行添加了any()
。
现在,以下内容仍然可以正常运行
x[5] <- 0
但这会发出警告并保持x不变:
x[11] <- 11
在确定无法更改x
的大小之前,可能还有其他方法可以定义。
答案 1 :(得分:1)
您可以为数组赋予类属性,然后为其定义[
方法。一个简单的版本可能是,
`[.thing` <- function(x, i) {
if (i > length(x)) stop("index outside range")
else x[[i]]
}
arr <- array(1:10, dim=c(1,10))
class(arr) <- c("thing", class(arr))
arr[1]
# [1] 1
arr[11]
# Error in `[.thing`(arr, 11) (from ...) : index outside range