如何在R中创建静态数组

时间:2015-09-09 15:09:41

标签: arrays r static

我需要为我的数据结构类创建一个静态数组,我选择用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

如何防止这种情况发生?

2 个答案:

答案 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