Я пишу модуль Rcpp, который нравится возвращать, поскольку один элемент RcppResultSet перечисляет список, элементы которого являются векторами. Например, .Call("myfunc")$foo
должно быть что-то как:
[[1]]
[1] 1
[[2]]
[1] 1 1
[[3]]
[1] 1 1 1
(точные числа не важны здесь). Проблема - то, что я не знаю правильный Rcpp способ сделать это. Я пытался передать a vector<vector<int> >
но это создает матрицу путем тихого взятия длины первого вектора как ширина (даже если матрица неровна!). Я попытался создать RcppList
но будь нелегко бросать различные объекты (как RcppVector
) безопасно в SEXP
s.
У кого-либо есть подсказки относительно лучших практик для контакта со сложными структурами, такими как списки векторов в Rcpp?
[Приятно видеть это здесь, но мы с Роменом обычно рекомендуем список 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 (надеюсь, через несколько дней). А пока вы можете заглянуть в архив SVN RQuantLib
Я бы предпочел использовать сжатый вариант решения Дирка:
using namespace Rcpp ;
return List::create(
_["vec"] = someVector,
_["lst"] = someList,
_["vec2"] = someOtherVector
) ;
Кроме того, в будущем возвращаясь к исходному вопросу, vector
должен обернуться списком целочисленных векторов, а не матрицей. См .:
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