Подтвердить что ты не робот

Сверните свой собственный связанный список/дерево в R?

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

Примечание. Я понимаю, что если вы на самом деле сворачиваете свои собственные реляционные структуры данных в R, вероятно, лучший способ выполнить то, что вы пытаетесь выполнить. Однако я считаю, что ответ поможет мне лучше понять общую структуру и концепции языка.

Изменить: Что касается комментария Мэтта Схотуэлла, суть этого вопроса в том, что я ищу, чтобы писать связанные списки и деревья чисто, внутри R, а не как расширение, написанное на C или некотором другой язык. Выполнение этого в качестве расширения или путем уклонения от тайных деталей интерпретатора преследует цель.

4b9b3361

Ответ 1

Связанный список в R может быть представлен как вектор, обычно a list. Вам не нужно писать специальный код для ссылки на следующий и предыдущий элементы, потому что R делает это для вас посредством индексирования.

Чтобы добавить новый элемент в список, просто отследите его длину и назначьте следующую строку.

lst <- list() # creates an empty (length zero) list
lst[[1]] <- 1 # automagically extends the lst
lst[[2]] <- 2 # ditto

Это может быть неэффективно для длинных списков из-за того, как R обрабатывает память. Если возможно, создайте список заранее и назначьте их содержимое по мере их появления.

lst <- list(1, 2, 3, 4, 5)    # a list of 5 items

lst <- vector("list", 10000)  # 10000 NULLs
lst[[1]] <- 1
lst[[10000]] <- 10000  # lst now contains 1, NULL, ..., NULL, 10000

Удаление элемента из списка может быть выполнено с отрицательными индексами.

lst <- list(1, 2, 3, 4, 5)
lst <- lst[-2]  # now contains 1, 3, 4, 5

Дерево - это список, содержащий другие списки.

tree <- list(list(1, 2), list(3, list(4, 5)))

# left child: list(1, 2)
tree[[1]]

# right child
tree[[2]]

# right child of right child:list(4, 5)
tree[[2]][[2]]

По умолчанию нет встроенного обеспечения структуры, например, только двое детей на node для двоичного дерева. Более структурированные подходы доступны через классы S4, но это сделает работу в крайнем случае.