【问题标题】:R: proto serialization/deserialization to listR:原型序列化/反序列化到列表
【发布时间】:2012-08-22 01:42:29
【问题描述】:

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

我不了解proto 的内部结构和 R 环境链接,足以知道是否有一种简单而可靠的方法可以将所有 proto 对象的属性作为 R 列表获取。这可以自动完成还是我应该考虑所有 proto 对象实现类似 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'))
})

【问题讨论】:

  • @G.Grothendieck ,proto 的维护者,经常来自 SO。我建议您同时发布一些代码。
  • @G.Grothendieck 感谢您的建议。我正在寻找将数据逻辑序列化为可以在 MongoDB 中持久化和检查/修改的 R 列表。我已经更改了问题的标题和描述以明确这一点。有没有一种好方法可以从原始对象及其所有父对象等中获取数据?
  • @G.Grothendieck 我在这里添加了关于我希望满足的期望的代码。如果我通过 $new 工厂方法连接对象创建,似乎这应该可以工作,因为父母应该在那里正确连接,对吧?
  • @G.Grothendieck 总体思路非常有效。就我而言,我更喜欢通过工厂原型使用显式构造方法。 gist.github.com/3431917如果您将之前的评论添加为答案,我会接受。

标签: r mongodb serialization deserialization proto


【解决方案1】:

将问题中的p1 变成一个列表。 L1

L1 <- as.list(p1)

并将其转回原型对象p1a,其父对象为Person

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

然后,您可以围绕这些基础构建任何您想要的结构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多