Эффективное добавление или удаление элементов в вектор или список в R?

Я реализую алгоритм, который включает в себя много добавления и удаления вещей из наборов. В R это медленно, поскольку, насколько я знаю, добавление или удаление объектов из вектора происходит медленно, поскольку весь вектор должен быть перераспределен. Есть ли способ сделать это более эффективно?

Изменить: моим текущим решением является использование логического вектора той же длины, что и список вещей, которые могут быть в наборе, и использование этого в качестве таблицы членства.

Ответ 1

Глава 2 В R Inferno есть интересные комментарии по этому вопросу, в том числе perdiodic растущие объекты, чтобы уменьшить фрагментацию памяти и накладные расходы.

Если вы знаете, каков максимальный размер набора, то метод, который вы предлагаете, вероятно, лучший, т.е. subset из всей юниверса, используя подходящий членский вектор. Трудно узнать, что лучше, не видя точно, что вы пытаетесь сделать, хотя.

Ответ 2

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

например.

vec <- rep(NA,10)
vec[1:3] <- 1:3
vec[4:5] <- 4:5
vec[6:10] <- 6:10

а не

vec <- 1:3
vec <- c(vec,4:5)
vec <- c(vec,6:10)

сравнить

> system.time({vec <- rep(NA,10^4); for (i in 1:(10^4)) vec[i] <- i })
   user  system elapsed 
  0.043   0.001   0.044 

к

> system.time({vec <- NULL; for (i in 1:(10^4)) vec <- c(vec,i) })
   user  system elapsed 
  0.249   0.089   0.335

Ответ 3

Трудно сказать, чего вы хотите. Возможно, вам действительно нужны команды стека, такие как push и pop. Не следующее. Но это быстрое решение.

Выделите вектор, достаточно большой, чтобы держать все ваши предметы того типа, который вам нужен. Задайте для каждого значения значение NA. Добавление элементов просто. Удаление элементов снова устанавливает их в NA. Использование вектора - это просто na.omit(myVec)

myVec <- numeric (maxLength)  # a vector of maximum length

is.na(myVec) <- 1:maxLength   # set every item in myVec to NA

myVec[c(2,6,20)] <- 5         # add some values

na.omit(myVec)

#This will also work if you can initialize all of your values to something that you know you won't need.