2010-06-21 7 views
26

RcppResultSet 목록의 요소 중 하나가 벡터 요소 인 목록으로 반환하려는 Rcpp 모듈을 작성하고 있습니다. 예를 들면, .Call("myfunc")$foo 같은 것을해야한다 :Rcpp에서 벡터 목록을 어떻게 만듭니 까?

[[1]] 
[1] 1 

[[2]] 
[1] 1 1 

[[3]] 
[1] 1 1 1 

을 (정확한 숫자는 여기에 중요하지 않습니다). 문제는 내가 이것을하는 올바른 Rcpp 방법을 모른다는 것입니다. 나는 vector<vector<int> >을 전달하려고 시도했으나 첫 번째 벡터의 길이를 너비로 조용히 가져 와서 매트릭스를 구성합니다 (심지어 매트릭스가 거친 경우에도!). RcppList을 만들려고 시도했지만 SEXP에 여러 객체 (예 : RcppVector)를 안전하게 전송하는 데 어려움이 있습니다.

누구나 Rcpp의 벡터 목록과 같은 복잡한 구조를 다루는 모범 사례에 대한 팁이 있습니까?

답변

37

[멋진 여기가 있지만, 로맹과 나는 일반적으로 질문에 대한 rccp-devel 목록을 권장합니다. 프로젝트가 아직 크지 않기 때문에 앞으로 웹 사이트에 흩어져있는 질문을 올려 놓으십시오. ]

RcppResultSet 많은 작업이 우리가 새로운 API 부르는 들어갔 반면 이전 고전 API의 일부입니다 (0.7부터 시작. * 버전). 현재 Rcpp page on CRAN과 비 네트의 목록을 봅니다. 6 개를 세고 계산합니다.

list(vec=someVector, lst=someList, vec2=someOtherVector) 

그리고 Rcpp::List도해야 될 것 R에서 무엇을 만들고, 새로운 API와

모든 일 명 성명에서

return Rcpp::List::create(Rcpp::Named("vec") = someVector, 
          Rcpp::Named("lst") = someList, 
          Rcpp::Named("vec2") = someOtherVector); 

같은 것을 반환 (및 명시 적 Rcpp::wrap() 호출을 사용) 리스트리스트의리스트를 할 수 있습니다 ...하지만 이것에 대한 단위 테스트가 있는지는 잘 모르겠지만, 500+ 유닛 테스트에는 수많은 예제가 있습니다.

지난 며칠 동안 고전 API에서 새로운 API로 많은 RQuantLib 코드를 변환했습니다. 이것은 아마도 우리가 0.833의 Rcpp을 얻으면 (아마도 며칠 후) 풀려날 것입니다. 그 동안 볼 수 RQuantLib SVN archive

+0

쿨, 감사합니다! 새로운'Rcpp :: ... '클래스를 고수하면 모든 것이 작동합니다! –

+0

정말 멋지다. 나는 여전히 새로운 클래스'Rcpp :: Date'와'Rcpp :: Datetime'을 만들 필요가있다. 그러나 오래된'RcppParams','RcppResultSet','RcppVector' ... 없이는 확실히 살 수있다. 새로운 단위 테스트 또는 예제를 추가하거나 문서에 추가하는 데 자유롭게 참여할 수 있습니다. 'rcpp-devel'에서 다음에 보자. –

+0

내 인생을 편하게 해준다. Rcpp를 배웠던 이래로 며칠이되었지만 R & C의 콤보로 돌아가는 것은 상상할 수 없습니다. –

21

나는 더크의 솔루션의 압축 변형 사용하는 경향이 : 다시 원래의 질문에 와서도

using namespace Rcpp ; 
return List::create( 
    _["vec"] = someVector, 
    _["lst"] = someList, 
    _["vec2"] = someOtherVector 
) ; 

을, vector< vector<int> >는 목록에 자신을 포장한다 행렬이 아닌 정수 벡터. 참조 :

require(Rcpp) 
require(inline) 
require(RUnit) 

fx <- cxxfunction(, ' 

    std::vector< std::vector<int> > v ; 

    std::vector<int> x1(1) ; v.push_back(x1); 
    std::vector<int> x2(2) ; v.push_back(x2); 
    std::vector<int> x3(3) ; v.push_back(x3); 

    return wrap(v) ; 

', plugin = "Rcpp") 

를 내가 얻을 :

> fx() 

[[1]] 
[1] 0 

[[2]] 
[1] 0 0 

[[3]] 
[1] 0 0 0