Как мне создать список векторов в Rcpp? - PullRequest
29 голосов
/ 22 июня 2010

Я пишу модуль 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?

Ответы [ 2 ]

42 голосов
/ 22 июня 2010

[Приятно видеть это здесь, но Ромен и я, как правило, рекомендуем список 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()), создавая то, что в R было бы

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

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

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

24 голосов
/ 22 июня 2010

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...