【发布时间】:2015-09-26 21:30:30
【问题描述】:
是否存在实现 FIFO 意义上的循环数组或向量的 R 包?
假设我们有这个数组:
2 4 7 1
在位置 1 插入新的观察(比如 3)时,我希望将第 n 个元素替换为第 n-1 个元素:
3 2 4 7
【问题讨论】:
-
c(new, tail(x, -1))
标签: r queue circular-buffer
是否存在实现 FIFO 意义上的循环数组或向量的 R 包?
假设我们有这个数组:
2 4 7 1
在位置 1 插入新的观察(比如 3)时,我希望将第 n 个元素替换为第 n-1 个元素:
3 2 4 7
【问题讨论】:
c(new, tail(x, -1))
标签: r queue circular-buffer
您可以尝试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>
【讨论】:
tracemem() 看到的(见编辑后的帖子)。
嗯,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)
很难说它是否足够稳定可以在实践中使用,而且它似乎只比简单的串联快一点。
【讨论】: