Как создать список векторов в 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