void checkOperandsConformable_full(const VectorBase* vl, const VectorBase* vr) { // Temporary kludge: VectorBase* vlnc = const_cast<VectorBase*>(vl); VectorBase* vrnc = const_cast<VectorBase*>(vr); if (Rf_isArray(vlnc) && Rf_isArray(vrnc) && !Rf_conformable(vlnc, vrnc)) Rf_error(_("non-conformable arrays")); if (isTs(vlnc)) { if (isTs(vrnc) && !Rf_tsConform(vlnc, vrnc)) Rf_error(_("non-conformable time-series")); if (vr->size() > vl->size()) Rf_error(_("time-series/vector length mismatch")); } else if (isTs(vrnc) && vl->size() > vr->size()) Rf_error(_("time-series/vector length mismatch")); }
std::vector<int> GetArrayDimensions(SEXP array) { if (!Rf_isArray(array)) { report_error("GetArrayDimensions called on a non-array object."); } SEXP r_dims = PROTECT(Rf_getAttrib(array, R_DimSymbol)); std::vector<int> dims(Rf_length(r_dims)); int *rdims = INTEGER(r_dims); for (int i = 0; i < dims.size(); ++i) { dims[i] = rdims[i]; } UNPROTECT(1); return dims; }