2012-08-22 117 views
1

我希望能够将一些简单的proto对象存储在持久存储区(MongoDB)中,其中的属性可以通过其他编程语言的代码进行操作。简单地说,我的意思是他们不会引用其他原始对象。它们的属性将是常见的R类型:列表,向量等。此外,每个对象都可以有一个工厂方法,该方法根据其属性值给出一个列表来创建它。因此,MongoDB到原型路径似乎很简单。R:原型序列化/反序列化到列表

我不明白proto的内部和R环境链接足够好,足以知道是否有一个简单而强大的方法来获取所有的proto对象的属性作为R列表。这可以自动完成,还是应该考虑实现类似to_list()方法的所有原始对象?

使用testthat一些示例代码和一个新的MongoDB驱动程序API我开发有关的行为,我想在这里看到:

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')) 
}) 
+3

@Grothendieck,proto的维护者,经常来自SO。我建议你在此期间发布一些代码。 –

+0

@ G.Grothendieck谢谢你的建议。我正在寻找逻辑序列化的数据到一个R列表,这个列表可以被保存,也可以在MongoDB中检查/修改。我已经改变了问题的标题和说明以清楚地说明问题。是否有一种很好的方法来从原始对象及其所有父母等中获取数据? – Sim

+0

@ G.Grothendieck我在这里添加了关于期望值的代码。如果我通过'$ new'工厂方法连接对象创建,看起来这应该起作用,因为父母应该正确地连接到那里,对吗? – Sim

回答

2

要打开p1从问题到列表中。 L1

L1 <- as.list(p1) 

,并把它放回原癌对象,p1a,其母公司是Person

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

然后,您可以建立您想围绕这些基本不管结构。