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

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

[[1]]
[1] 1

[[2]]
[1] 1 1

[[3]]
[1] 1 1 1

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

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

30
задан Jonathan Chang 21 June 2010 в 21:30
поделиться

2 ответа

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

43
ответ дан 27 November 2019 в 23:33
поделиться

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

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
24
ответ дан 27 November 2019 в 23:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: