R - Наружное произведение двух векторов с использованием пользовательских FUN для возврата списков

Эта страница на официальном сайте mongodb адресует точно этот вопрос:

http://docs.mongodb.org/ecosystem/tutorial/model-data- for-ruby-on-rails /

Когда мы показываем наш список историй, нам нужно будет показать имя пользователя, разместившего историю. Если бы мы использовали реляционную базу данных, мы могли бы выполнить соединение с пользователями и магазинами и получить все наши объекты в одном запросе. Но MongoDB не поддерживает объединения, и поэтому время от времени требуется бит денормализации. Здесь это означает кеширование атрибута «имя пользователя».

Реляционные пуристы уже чувствуют себя неловко, как будто мы нарушаем какой-то универсальный закон. Но давайте иметь в виду, что коллекции MongoDB не эквивалентны реляционным таблицам; каждая из которых служит уникальной проектной цели. Нормализованная таблица обеспечивает атомный изолированный кусок данных. Однако документ более тесно представляет собой объект в целом. В случае сайта социальных новостей можно утверждать, что имя пользователя является неотъемлемой частью истории, опубликованной.

blockquote>

0
задан George 17 January 2019 в 14:27
поделиться

1 ответ

Я могу подойти довольно близко (или, может быть, так далее?) (А) заставить вашу функцию возвращать list и (б) векторизовать ее. Из ?outer

FUN ... должна быть векторизованная функция (или имя одного), ожидающая не менее двух аргументов и возвращающая значение такой же длины, что и первый (и второй).

listify <- function(a,b){
   list(a,b)
}

lv = Vectorize(listify)

s1 <- seq(1,3)
s2 <- seq(4,6)

result = t(outer(s1,s2,FUN = lv))
result
#      [,1]      [,2]      [,3]     
# [1,] Integer,2 Integer,2 Integer,2
# [2,] Integer,2 Integer,2 Integer,2
# [3,] Integer,2 Integer,2 Integer,2

result[1, 1]
# [[1]]
#      a b
# [1,] 1 4

result[2, 1]
# [[1]]
#      a b
# [1,] 1 5

Обратите внимание, что каждый элемент матрицы представляет собой список длиной 1.

Как отмечено в комментариях, без дополнительной информации я не вижу никакого преимущества наличия этих одноэлементных списков в матрице. С длинной таблицей expand.grid или трехмерным массивом, кажется, потенциально легче работать.

0
ответ дан Gregor 17 January 2019 в 14:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: