On Sun, May 3, 2015 at 11:29 PM, Antonio Piccolboni <anto...@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 <tke...@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 <tke...@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 <e...@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 | e...@debian.org >>>> >>> >>> >>> >>> -- >>> http://www.keittlab.org/ >>> >> >> >> >> -- >> http://www.keittlab.org/ >> >> _______________________________________________ >> Rcpp-devel mailing list >> Rcpp-devel@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@lists.r-forge.r-project.org > https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel > -- http://www.keittlab.org/
_______________________________________________ Rcpp-devel mailing list Rcpp-devel@lists.r-forge.r-project.org https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel