[Rcpp-devel] List of Lists to List of Vectors

Tim Keitt tkeitt at utexas.edu
Mon May 4 21:23:14 CEST 2015


On Sun, May 3, 2015 at 11:29 PM, Antonio Piccolboni <antonio at piccolboni.info
> wrote:

> Check here
> <https://github.com/RevolutionAnalytics/rmr2/blob/master/pkg/src/t-list.cpp>
> for something similar to Tim's solution that preallocates all vectors to
> avoid the costly push_back. Still needs the unlists in R, so it's expensive
> in that dimension, the number of lists in the output.
>

I may have a way around the unlist part; still needs testing.

push_back is amortized constant so only a little costly.

THK


>
>
> Antonio
>
> On Sun, May 3, 2015 at 4:22 PM, Tim Keitt <tkeitt at utexas.edu> wrote:
>
>> A slightly improved version:
>>
>> library(Rcpp)
>>
>> code = '
>> SEXP test(List a)
>> {
>>   auto l = Rf_length(a[0]);
>>   using svec = std::vector<SEXP>;
>>   std::vector<svec> x(l);
>>   for (List b : a)
>>   {
>>     if (b.size() != l)
>>       stop("Ragged input");
>>     for (int i = 0; i != l; ++i)
>>       x[i].push_back(b[i]);
>>   }
>>   return wrap(x);
>> }'
>>
>> f = cppFunction(code = code, plugins = "cpp11")
>>
>> res = lapply(f(list(list(T, 1, 'a'),
>>                     list(F, 2, 'b'))),
>>              unlist)
>>
>>
>> On Sun, May 3, 2015 at 11:57 AM, Tim Keitt <tkeitt at utexas.edu> wrote:
>>
>>> Here's a really bare-bones version. Not very pretty or complete, but it
>>> does do the job. Could the 'unlist' part be converted to Rcpp?
>>>
>>> THK
>>>
>>> library(Rcpp)
>>>
>>> code = '
>>> SEXP test(List a)
>>> {
>>>   int l = Rf_length(a[0]);
>>>   typedef std::vector<SEXP> svec;
>>>   std::vector<svec> x(l);
>>>   for (int i = 0; i != l; ++i)
>>>     for (int j = 0; j != a.size(); ++j)
>>>     {
>>>       List b = a[j];
>>>       x[i].push_back(b[i]);
>>>     }
>>>   return wrap(x);
>>> }'
>>>
>>> f = cppFunction(code = code)
>>>
>>> res = lapply(f(list(list(1, 'a'), list(2, 'b'))), unlist)
>>>
>>>
>>> On Sat, May 2, 2015 at 1:18 PM, Dirk Eddelbuettel <edd at debian.org>
>>> wrote:
>>>
>>>>
>>>> On 2 May 2015 at 10:49, William Dunlap wrote:
>>>> | Since translation from R to Rcpp is "seamless" I will leave that to
>>>> you.
>>>>
>>>> One problem is with the strongly typed nature of C++.  Rearranging
>>>> dynamicly
>>>> growing objects can be done.  I think I used Boost's variant type a few
>>>> years.  I am sure there are other possibilities.  We should collect a
>>>> few and
>>>> compare.   But in C++ please :)
>>>>
>>>> Dirk
>>>>
>>>> --
>>>> http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org
>>>>
>>>
>>>
>>>
>>> --
>>> http://www.keittlab.org/
>>>
>>
>>
>>
>> --
>> http://www.keittlab.org/
>>
>> _______________________________________________
>> Rcpp-devel mailing list
>> Rcpp-devel at lists.r-forge.r-project.org
>> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
>>
>
>
> _______________________________________________
> Rcpp-devel mailing list
> Rcpp-devel at lists.r-forge.r-project.org
> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
>



-- 
http://www.keittlab.org/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20150504/7e6717b3/attachment-0001.html>


More information about the Rcpp-devel mailing list