【问题标题】:How can I create a static array in R如何在 R 中创建静态数组
【发布时间】:2015-09-09 15:09:40
【问题描述】:

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

我怎样才能防止这种情况发生?

【问题讨论】:

  • 在基本 R 中没有固定大小的数组或矩阵。如果您只使用二维数组(矩阵),请查看 Matrix 包,它禁止在定义的大小之外显式下标。当然,另一种选择是实现一个正式的 S4 类。

标签: arrays r static


【解决方案1】:

我也不知道实现这一点的机制。但以下内容可能会让您了解如何实现静态数组之类的东西。

我将一个类 static_vector 分配给一个向量,如下所示:

x <- 1:10
class(x) <- "static_vector"

接下来我为这个类的赋值运算符[&lt;-定义一个新方法:

"[<-.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 的大小之前,可能还需要定义其他方法。

【讨论】:

  • 请指定此解决方案未矢量化。例如x[c(1,11)]&lt;-0 不尊重 OP 的要求。
  • @nicola:感谢您的评论。正如我所写,这不是一个完整的解决方案,而只是一个起点。但我会尽量适应至少你提到的简单案例。
【解决方案2】:

你可以给你的数组一个类属性,然后为它定义一个[ 方法。一个简单的版本可能是这样的,

`[.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

【讨论】:

  • 请指定此解决方案未矢量化。
  • 这不会阻止分配,为此您必须定义[&lt;-.thing
  • @Stibu 好点。这远不是一个完整的解决方案,只是为了说明这个想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-26
  • 2018-12-24
  • 1970-01-01
  • 2015-02-12
  • 2016-05-01
相关资源
最近更新 更多