2015-09-26 3 views
3

Существует ли R-пакет, который реализует круговую матрицу или вектор в смысле FIFO?R круглый массив/вектор

Скажем, у нас есть этот массив:

2 4 7 1 

При установке нового наблюдения (скажем, 3) в положении 1, я хочу, п-й элемент должен быть заменен на п-первый элемент:

3 2 4 7 
+2

https://cran.rstudio.com/web/packages/rstackdeque/index.html – hrbrmstr

+0

'c (new, tail (x, -1))' –

ответ

4

Вы можете попробовать 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> 
+0

Это тоже пришло в голову, но мне интересно если это эффективно для очень больших массивов, которые обновляются на высоких частотах ?! – Juergen

+0

Я не понимаю, почему этого не будет. Все это примитивные функции –

+0

Не скопирован ли массив для каждой вставки? – Juergen

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) 

Трудно сказать, если она достаточно стабильна для использования в практика, хотя и кажется, что она лишь немного быстрее, чем простая конкатенация.

Смежные вопросы