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