Вопрос

Я пишу модуль RCPP и хотел бы вернуться в качестве одного элемента списка Rcppresultset Список, элементы которых являются векторами. Например, .Call("myfunc")$foo должно быть что -то вроде:

[[1]]
[1] 1

[[2]]
[1] 1 1

[[3]]
[1] 1 1 1

(Точные числа здесь не важны). Проблема в том, что я не знаю правильного способа сделать RCPP. Я попытался пройти vector<vector<int> > Но это строит матрицу, молча принимая длину первого вектора в виде ширины (даже если матрица неровная!). Я попытался построить RcppList но упростить литье различных объектов (как RcppVector) безопасно в SEXPс

У кого -нибудь есть советы о лучших практиках для борьбы со сложными структурами, такими как списки векторов в RCPP?

Это было полезно?

Решение

Приятно видеть это здесь, но Romain, и я вообще рекомендую RCCP-Devel. Список для вопроса. Пожалуйста, опубликуйте там, в будущем, так как проект еще не такой большой, что он требует, чтобы вопросы разбросаны по всей сети.

RcppResultSet является частью старшего Классик API, в то время как большая работа пошла на то, что мы называем новый API (начиная с 0,7. * Релизы). Посмотрите на текущий Страница RCPP на Cran и список виньеток - шесть и подсчет.

С новым API вы бы вернули что -то вроде

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

все в одном утверждении (и, возможно, с использованием явного Rcpp::wrap() звонки), создавая то, что в р было бы

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

И Rcpp::List Также должно быть в состоянии составить списки списков списков ... хотя я не уверен, что у нас есть модульные тесты для этого-но есть многочисленные примеры в более 500 модульных тестах.

Как это происходит, я провел последние несколько дней, конвертируя много Rquantlib. Код из классической API к новой API. Это, вероятно, будет выпущено, как только мы получим версию 0.8.3 RCPP. В выход (надеюсь, через несколько дней). А пока вы можете посмотреть на Rquantlib SVN Архив

Другие советы

Я хотел бы использовать сжатое изменение решения Дирка:

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top