Что такое идиоматический способ сбора результатов в цикле в R, если количество конечных результатов неизвестно заранее? Вот игрушка пример:Сбор неизвестного числа результатов в цикле
results = vector('integer')
i=1L
while (i < bigBigBIGNumber) {
if (someCondition(i)) results = c(results, i)
i = i+1
}
results
Проблема с этим примером является то, что (я предполагаю) он будет иметь квадратную сложность, как должен быть перераспределен на каждом Append вектор. (Это правильно?) Я ищу решение, которое позволяет избежать этого.
Я нашел Filter
, но для этого требуется предварительная генерация 1:bigBigBIGNumber
, которую я хочу избежать, чтобы сэкономить память. (Вопрос: действительно for (i in 1:N)
также заранее создать 1:N
и сохранить его в памяти?)
Я мог бы сделать что-то вроде список связаны, как это:.
results = list()
i=1L
while (i < bigBigBIGNumber) {
if (someCondition(i)) results = list(results, i)
i = i+1
}
unlist(results)
(Обратите внимание, что это не конкатенация Это построив такую структуру, как list(list(list(1),2),3)
, затем сплющивание с помощью unlist
.)
Есть ли лучший способ, чем этот? Что такое идиоматический способ, который обычно используется? (Я очень новичок в R.) Я ищу предложение о том, как решить эту проблему. Предложения, как о компактном (легко писать), так и быстродействующем коде, приветствуются! (Но я хотел бы сосредоточиться на быстрой и эффективной памяти.)
Параметр 'Функция c' используется для расширяют либо векторы, либо списки. Если вы можете оценить размер, то выделение с помощью «vector (« integer », size)» поможет снизить стоимость продления. –
@DWin Существуют ли существующие инструменты, которые расширяют массив по-своему, по требованию? (Например, удвоить размер предварительно распределенной массива, как только ее емкость будет достигнута, и избежать квадратичной сложности) – Szabolcs
@Szabolcs, почему вы думаете, почему здесь будет помогать замена 'c' на' list'? Если вы не перераспределите список, эта же проблема сохраняется, не так ли? – Arun