Как создать список векторов в Rcpp?

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

[[1]]
[1] 1

[[2]]
[1] 1 1

[[3]]
[1] 1 1 1

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

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

Ответ 1

[Приятно видеть это здесь, но Romain и я обычно рекомендую список rccp-devel. Пожалуйста, опубликуйте его в будущем, поскольку проект еще не настолько велик, что он требует разбросать вопросы по всему Интернету. ]

RcppResultSet является частью старого классического API, тогда как большая часть работы перешла к тому, что мы называем новым API (начиная с выпусков 0.7. *). Посмотрите текущую и список виньеток - шесть и подсчет.

С новым API вы вернете что-то вроде

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

все в одном выражении (и, возможно, с использованием явных вызовов Rcpp::wrap()), создавая в R

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

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

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

Ответ 2

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

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