2012-08-22 2 views
1

몇 가지 간단한 proto 개체를 영구 저장소 (MongoDB)에 저장하여 다른 프로그래밍 언어의 코드로 해당 개체를 조작 할 수 있기를 바랍니다. 간단히 말해서 다른 프로토 객체를 참조하지 않을 것입니다. 그것들의 속성은 일반적인 R 타입 (목록, 벡터 등)이 될 것입니다. 또한 각 객체는 속성 값을 가진리스트가있는 팩토리 메소드를 가질 수 있습니다. 따라서 MongoDB-to-proto 경로는 간단합니다.R : proto serialization/deserialization을 사용하여 목록으로 작성

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

@ G.Grothendieck, proto의 관리자 인 경우가 종종 있습니다. 나는 그동안 코드를 게시 할 것을 제안합니다. –

+0

@ G.Grothendieck 제안에 감사드립니다. MongoDB에서 검사되고 수정 될뿐만 아니라 유지 될 수있는 R 목록에 대한 데이터의 논리적 직렬화를 찾고 있습니다. 이 질문의 제목과 설명을 분명하게 변경했습니다. proto 객체뿐만 아니라 모든 부모 등에서 데이터를 가져 오는 좋은 방법이 있습니까? – Sim

+0

@ G.Grothendieck 여기에 만족시키고 싶은 기대치에 관한 코드를 추가했습니다. '$ new' factory 메쏘드를 통해 객체 생성을 연결한다면, 부모가 제대로 연결되어야하는 것처럼 보일 것입니다. 맞습니까? – Sim

답변

2

이리스트로 질문에서 p1을 켭니다. L1 :

L1 <- as.list(p1) 

와 그의 부모 Person 프로토 객체, p1a로 다시 설정하는 :

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

당신은 당신이 기초 주위에 원하는대로 구조를 구축 할 수 있습니다.

관련 문제