【问题标题】:R circular array/vectorR圆形数组/向量
【发布时间】:2015-09-26 21:30:30
【问题描述】:

是否存在实现 FIFO 意义上的循环数组或向量的 R 包?

假设我们有这个数组:

2 4 7 1

在位置 1 插入新的观察(比如 3)时,我希望将第 n 个元素替换为第 n-1 个元素:

3 2 4 7

【问题讨论】:

标签: r queue circular-buffer


【解决方案1】:

您可以尝试c() 并切断结果的长度。

x <- c(2, 4, 7, 1)
c(3, x)[1:length(x)]
# [1] 3 2 4 7

此方法不会复制x

tracemem(x)
# [1] "<0x3cb5998>"
c(3, x)[1:length(x)]
# [1] 3 2 4 7
untracemem(x)

append() 的源代码似乎也有一些有用的方法可以尝试。

append
# function (x, values, after = length(x)) 
# {
#     lengx <- length(x)
#     if (!after) 
#         c(values, x)
#     else if (after >= lengx) 
#         c(x, values)
#     else c(x[1L:after], values, x[(after + 1L):lengx])
# }
# <bytecode: 0x31ac490>
# <environment: namespace:base>

【讨论】:

  • 这也让我想到了,但我想知道这对于高频更新的非常大的数组是否有效?!
  • 我不明白为什么不会。这些都是原始函数
  • 不是每次插入都要复制数组吗?
  • @Juergen - 不是我从tracemem() 看到的(见编辑后的帖子)。
【解决方案2】:

嗯,Richard Scriven's 解决方案很可能是可行的方法,但如果您有冒险精神,可以尝试Rexamine/DataStructures

> devtools::install_github("Rexamine/DataStructures")
> library(DataStructures)
> q <- queue_create()
> queue_empty(q)
[1] TRUE
> for (i in c(1, 7, 4, 2)) { queue_push(q, i) }
> queue_empty(q)
[1] FALSE
> queue_pop(q)
[1] 1
> format(q)
[1] "7" "4" "2"
> queue_push(q, 3)

很难说它是否足够稳定可以在实践中使用,而且它似乎只比简单的串联快一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 2012-04-11
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多