#include #include #include using namespace Rcpp; using namespace std; template Vector cpp_stack_impl(List array_list, int along, Vector fill, bool ovr) { auto dimnames = vector>(along); // dim: names along auto axmap = vector>(along); // dim: element name->index auto ax_unnamed = vector(along); // counter for unnamed dimension elements auto a2r = vector>>(array_list.size()); // index array>dim>element // create lookup tables for all present dimension names for (int ai=0; ai>(array_list[ai]); auto dim = as>(a.attr("dim")); auto dn = as(a.attr("dimnames")); if (along == dim.size()+1) { // along introduces new dimension if (array_list.attr("names") == R_NilValue) dn.push_back(CharacterVector::create(NA_STRING)); else dn.push_back(as>(array_list.attr("names"))[ai]); dim.push_back(1); } a2r[ai] = vector>(dim.size()); if (dimnames.size() < dim.size()) { dimnames.resize(dim.size()); axmap.resize(dim.size()); ax_unnamed.resize(dim.size()); } for (int d=0; d %i\n", ai, d, e, axmap[d].size() + ax_unnamed[d]); a2r[ai][d].push_back(axmap[d].size() + ax_unnamed[d]++); dimnames[d].push_back(NA_STRING); } } else { auto dni = as>(dn[d]); for (int e=0; esecond); // Rprintf("array %i dim %i: %s -> %i\n", ai, d, dni[e].c_str(), it->second); } } } } /* for (int ai=0; ai(cout, " ")); cout << "\n"; } */ // create result array with attributes auto rdim = IntegerVector(dimnames.size()); for (int ai=0; ai()); auto result = Vector(n, fill[0]); result.attr("dim") = rdim; result.attr("dimnames") = rdnames; // fill the result array int maxdim = rdim.size() - 1; for (int ai=0; ai>(array_list[ai]); auto it = vector::iterator>(a2r[ai].size()); // each result dim for (int d=0; d STRSXP) stop("Invalid type: %d %s\n", cur_type, type2name(array_list[ai])); if (cur_type > max_type) max_type = cur_type; } switch(max_type) { case LGLSXP: return cpp_stack_impl(array_list, along, as(fill), ovr); case INTSXP: return cpp_stack_impl(array_list, along, as(fill), ovr); case REALSXP: return cpp_stack_impl(array_list, along, as(fill), ovr); case CPLXSXP: return cpp_stack_impl(array_list, along, as(fill), ovr); case STRSXP: return cpp_stack_impl(array_list, along, as(fill), ovr); default: return R_NilValue; // this should not happen } }