Я хотел бы иметь возможность хранить несколько простых объектов 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'))
})
$new
, кажется, что это должно работать, поскольку родители должны правильно подключиться, верно? - person Sim   schedule 22.08.2012