R: прото-сериализация/десериализация в список

Я хотел бы иметь возможность хранить несколько простых объектов proto в постоянном хранилище (MongoDB), где их свойствами можно управлять с помощью кода из других языков программирования. Под простым я подразумеваю, что они не будут ссылаться на другие протообъекты. Их свойства будут обычными типами R: списками, векторами и т. д. Кроме того, у каждого объекта может быть фабричный метод, создающий его по заданному списку со значениями его свойств. Поэтому путь от MongoDB к прототипу кажется простым.

Я недостаточно хорошо разбираюсь во внутреннем устройстве proto и цепочке среды R, чтобы знать, существует ли простой и надежный способ получить все свойства прото-объекта в виде списка R. Можно ли это сделать автоматически, или я должен думать о том, чтобы все прото-объекты реализовывали что-то вроде метода to_list()?

Некоторый пример кода с использованием testthat и нового API драйвера MongoDB, который я разрабатываю для поведения, которое я хотел бы видеть здесь:

test_that("proto persistence", {
  Person <- proto(
    ..Name = 'PersonFactory',
    has_tag = function(., tag) { 
     tag %in% .$tags 
    },
    new = function(., name, tags=c()) {
     .$proto(..Name='Person', name=name, tags=tags)
    } 
  )

  p1 <- Person$new(name='bob', tags=c('friend', 'coworker'))

  coll <- test_db()$collection('test') 
  coll$store('bob', p1)

  result <- coll$find_one(id='bob')
  expect_true(is.list(result))
  expect_true(is.list(result$proto))
  expect_equal(result$proto$name, 'bob')
  expect_equal(result$proto$tags, c('friend', 'coworker'))

  p2 <- coll$load('bob')
  expect_equal(p2$name, 'bob')
  expect_equal(p2$tags, c('friend', 'coworker'))
  expect_true(p2$has_tag('friend'))
})

person Sim    schedule 22.08.2012    source источник
comment
@G.Grothendieck, сопровождающий proto, часто приходит на SO. Тем временем я бы посоветовал вам опубликовать код.   -  person IRTFM    schedule 22.08.2012
comment
@ Г. Гротендик Спасибо за предложение. Я ищу логическую сериализацию данных в список R, который можно сохранить, а также проверить/изменить в MongoDB. Я изменил название вопроса и описание, чтобы прояснить это. Есть ли хороший способ просто получить данные из прототипа объекта, а также всех его родителей и т. д.?   -  person Sim    schedule 22.08.2012
comment
@ G.Grothendieck Я добавил код об ожиданиях, которые я хотел бы удовлетворить здесь. Если я подключаю создание объекта с помощью фабричного метода $new, кажется, что это должно работать, поскольку родители должны правильно подключиться, верно?   -  person Sim    schedule 22.08.2012
comment
@ G.Grothendieck, общая идея работает отлично. В моем случае я предпочитаю использовать явный метод конструктора через фабричный прототип. gist.github.com/3431917 Если вы добавите свой предыдущий комментарий в качестве ответа, я приму его.   -  person Sim    schedule 23.08.2012


Ответы (1)


Превратить p1 из вопроса в список. L1 :

L1 <- as.list(p1)

и превратить его обратно в прото-объект p1a, чьим родителем является Person :

p1a <- as.proto(L1, parent = Person)

Затем вы можете построить любую структуру, которую вы хотите, вокруг этих основ.

person G. Grothendieck    schedule 23.08.2012