Эта страница на официальном сайте mongodb адресует точно этот вопрос:
http://docs.mongodb.org/ecosystem/tutorial/model-data- for-ruby-on-rails /
Когда мы показываем наш список историй, нам нужно будет показать имя пользователя, разместившего историю. Если бы мы использовали реляционную базу данных, мы могли бы выполнить соединение с пользователями и магазинами и получить все наши объекты в одном запросе. Но MongoDB не поддерживает объединения, и поэтому время от времени требуется бит денормализации. Здесь это означает кеширование атрибута «имя пользователя».
Реляционные пуристы уже чувствуют себя неловко, как будто мы нарушаем какой-то универсальный закон. Но давайте иметь в виду, что коллекции MongoDB не эквивалентны реляционным таблицам; каждая из которых служит уникальной проектной цели. Нормализованная таблица обеспечивает атомный изолированный кусок данных. Однако документ более тесно представляет собой объект в целом. В случае сайта социальных новостей можно утверждать, что имя пользователя является неотъемлемой частью истории, опубликованной.
blockquote>
Я могу подойти довольно близко (или, может быть, так далее?) (А) заставить вашу функцию возвращать list
и (б) векторизовать ее. Из ?outer
blockquote>
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
или трехмерным массивом, кажется, потенциально легче работать.