Я реализую алгоритм, который включает большое добавление и удаление вещей от наборов. В R это медленно, потому что насколько я знаю, добавляя или удаляя вещи из вектора, является медленным, так как весь вектор должен быть перераспределен. Существует ли путь, действительно делают это более эффективно?
Править: Мое текущее решение состоит в том, чтобы использовать булев вектор той же длины как список вещей, которые могут быть в наборе и использовании что как таблица членства.
В главе 2 The R Inferno есть несколько интересных комментариев по этому поводу, включая пердиодический рост объектов для уменьшения фрагментации памяти и накладных расходов на выделение.
Если вы знаете, каков конечный размер множества, то предложенный вами метод, вероятно, будет лучшим - т.е. подмножество
из всей вселенной с использованием подходящего вектора принадлежности. Трудно сказать, что лучше, не видя, что именно вы пытаетесь сделать.
Если вы можете, инициализируйте вектор так, чтобы его длина была равна его максимальной длине во время работы алгоритма, это может помочь.
например,
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
Трудно сказать, что вы хотите. Возможно, вам действительно нужны команды стека, такие как 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.