00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <RcppResultSet.h>
00024
00025 RcppResultSet::RcppResultSet() : numProtected(0) { }
00026
00027 void RcppResultSet::add(std::string name, RcppDate& date) {
00028 SEXP value = PROTECT(Rf_allocVector(REALSXP, 1));
00029 numProtected++;
00030 REAL(value)[0] = date.getJDN() - RcppDate::Jan1970Offset;
00031 SEXP dateclass = PROTECT(Rf_allocVector(STRSXP,1));
00032 numProtected++;
00033 SET_STRING_ELT(dateclass, 0, Rf_mkChar("Date"));
00034 Rf_setAttrib(value, R_ClassSymbol, dateclass);
00035 values.push_back(make_pair(name, value));
00036 }
00037
00038 void RcppResultSet::add(std::string name, RcppDatetime& datetime) {
00039 SEXP value = PROTECT(Rf_allocVector(REALSXP, 1));
00040 numProtected++;
00041 REAL(value)[0] = datetime.getFractionalTimestamp();
00042 SEXP datetimeclass = PROTECT(Rf_allocVector(STRSXP,2));
00043 numProtected++;
00044 SET_STRING_ELT(datetimeclass, 0, Rf_mkChar("POSIXt"));
00045 SET_STRING_ELT(datetimeclass, 1, Rf_mkChar("POSIXct"));
00046 Rf_setAttrib(value, R_ClassSymbol, datetimeclass);
00047 values.push_back(make_pair(name, value));
00048 }
00049
00050 void RcppResultSet::add(std::string name, double x) {
00051 SEXP value = PROTECT(Rf_allocVector(REALSXP, 1));
00052 numProtected++;
00053 REAL(value)[0] = x;
00054 values.push_back(make_pair(name, value));
00055 }
00056
00057 void RcppResultSet::add(std::string name, int i) {
00058 SEXP value = PROTECT(Rf_allocVector(INTSXP, 1));
00059 numProtected++;
00060 INTEGER(value)[0] = i;
00061 values.push_back(make_pair(name, value));
00062 }
00063
00064 void RcppResultSet::add(std::string name, std::string strvalue) {
00065 SEXP value = PROTECT(Rf_allocVector(STRSXP, 1));
00066 numProtected++;
00067 SET_STRING_ELT(value, 0, Rf_mkChar(strvalue.c_str()));
00068 values.push_back(make_pair(name, value));
00069 }
00070
00071 void RcppResultSet::add(std::string name, double *vec, int len) {
00072 if (vec == 0)
00073 throw std::range_error("RcppResultSet::add: NULL double vector");
00074 SEXP value = PROTECT(Rf_allocVector(REALSXP, len));
00075 numProtected++;
00076 for (int i = 0; i < len; i++)
00077 REAL(value)[i] = vec[i];
00078 values.push_back(make_pair(name, value));
00079 }
00080
00081 void RcppResultSet::add(std::string name, RcppDateVector& datevec) {
00082 SEXP value = PROTECT(Rf_allocVector(REALSXP, datevec.size()));
00083 numProtected++;
00084 for (int i = 0; i < datevec.size(); i++) {
00085 REAL(value)[i] = datevec(i).getJDN() - RcppDate::Jan1970Offset;
00086 }
00087 SEXP dateclass = PROTECT(Rf_allocVector(STRSXP,1));
00088 numProtected++;
00089 SET_STRING_ELT(dateclass, 0, Rf_mkChar("Date"));
00090 Rf_setAttrib(value, R_ClassSymbol, dateclass);
00091 values.push_back(make_pair(name, value));
00092 }
00093
00094 void RcppResultSet::add(std::string name, RcppDatetimeVector &dtvec) {
00095 SEXP value = PROTECT(Rf_allocVector(REALSXP, dtvec.size()));
00096 numProtected++;
00097 for (int i = 0; i < dtvec.size(); i++) {
00098 REAL(value)[i] = dtvec(i).getFractionalTimestamp();
00099 }
00100 SEXP datetimeclass = PROTECT(Rf_allocVector(STRSXP,2));
00101 numProtected++;
00102 SET_STRING_ELT(datetimeclass, 0, Rf_mkChar("POSIXt"));
00103 SET_STRING_ELT(datetimeclass, 1, Rf_mkChar("POSIXct"));
00104 Rf_setAttrib(value, R_ClassSymbol, datetimeclass);
00105 values.push_back(make_pair(name, value));
00106 }
00107
00108 void RcppResultSet::add(std::string name, RcppStringVector& stringvec) {
00109 int len = (int)stringvec.size();
00110 SEXP value = PROTECT(Rf_allocVector(STRSXP, len));
00111 numProtected++;
00112 for (int i = 0; i < len; i++)
00113 SET_STRING_ELT(value, i, Rf_mkChar(stringvec(i).c_str()));
00114 values.push_back(make_pair(name, value));
00115 }
00116
00117 void RcppResultSet::add(std::string name, int *vec, int len) {
00118 if (vec == 0)
00119 throw std::range_error("RcppResultSet::add: NULL int vector");
00120 SEXP value = PROTECT(Rf_allocVector(INTSXP, len));
00121 numProtected++;
00122 for (int i = 0; i < len; i++)
00123 INTEGER(value)[i] = vec[i];
00124 values.push_back(make_pair(name, value));
00125 }
00126
00127 void RcppResultSet::add(std::string name, double **mat, int nx, int ny) {
00128 if (mat == 0)
00129 throw std::range_error("RcppResultSet::add: NULL double matrix");
00130 SEXP value = PROTECT(Rf_allocMatrix(REALSXP, nx, ny));
00131 numProtected++;
00132 for (int i = 0; i < nx; i++)
00133 for (int j = 0; j < ny; j++)
00134 REAL(value)[i + nx*j] = mat[i][j];
00135 values.push_back(make_pair(name, value));
00136 }
00137
00138 void RcppResultSet::add(std::string name, int **mat, int nx, int ny) {
00139 if (mat == 0)
00140 throw std::range_error("RcppResultSet::add: NULL int matrix");
00141 SEXP value = PROTECT(Rf_allocMatrix(INTSXP, nx, ny));
00142 numProtected++;
00143 for (int i = 0; i < nx; i++)
00144 for (int j = 0; j < ny; j++)
00145 INTEGER(value)[i + nx*j] = mat[i][j];
00146 values.push_back(make_pair(name, value));
00147 }
00148
00149 void RcppResultSet::add(std::string name, std::vector<std::string>& vec) {
00150 if (vec.size() == 0)
00151 throw std::range_error("RcppResultSet::add; zero length vector<string>");
00152 int len = (int)vec.size();
00153 SEXP value = PROTECT(Rf_allocVector(STRSXP, len));
00154 numProtected++;
00155 for (int i = 0; i < len; i++)
00156 SET_STRING_ELT(value, i, Rf_mkChar(vec[i].c_str()));
00157 values.push_back(make_pair(name, value));
00158 }
00159
00160 void RcppResultSet::add(std::string name, std::vector<int>& vec) {
00161 if (vec.size() == 0)
00162 throw std::range_error("RcppResultSet::add; zero length vector<int>");
00163 int len = (int)vec.size();
00164 SEXP value = PROTECT(Rf_allocVector(INTSXP, len));
00165 numProtected++;
00166 for (int i = 0; i < len; i++)
00167 INTEGER(value)[i] = vec[i];
00168 values.push_back(make_pair(name, value));
00169 }
00170
00171 void RcppResultSet::add(std::string name, std::vector<double>& vec) {
00172 if (vec.size() == 0)
00173 throw std::range_error("RcppResultSet::add; zero length vector<double>");
00174 int len = (int)vec.size();
00175 SEXP value = PROTECT(Rf_allocVector(REALSXP, len));
00176 numProtected++;
00177 for (int i = 0; i < len; i++)
00178 REAL(value)[i] = vec[i];
00179 values.push_back(make_pair(name, value));
00180 }
00181
00182 void RcppResultSet::add(std::string name, std::vector<std::vector<int> >& mat) {
00183 if (mat.size() == 0)
00184 throw std::range_error("RcppResultSet::add: zero length vector<vector<int> >");
00185 else if (mat[0].size() == 0)
00186 throw std::range_error("RcppResultSet::add: no columns in vector<vector<int> >");
00187 int nx = (int)mat.size();
00188 int ny = (int)mat[0].size();
00189 SEXP value = PROTECT(Rf_allocMatrix(INTSXP, nx, ny));
00190 numProtected++;
00191 for (int i = 0; i < nx; i++)
00192 for (int j = 0; j < ny; j++)
00193 INTEGER(value)[i + nx*j] = mat[i][j];
00194 values.push_back(make_pair(name, value));
00195 }
00196
00197 void RcppResultSet::add(std::string name, std::vector<std::vector<double> >& mat) {
00198 if (mat.size() == 0)
00199 throw std::range_error("RcppResultSet::add: zero length vector<vector<double> >");
00200 else if (mat[0].size() == 0)
00201 throw std::range_error("RcppResultSet::add: no columns in vector<vector<double> >");
00202 int nx = (int)mat.size();
00203 int ny = (int)mat[0].size();
00204 SEXP value = PROTECT(Rf_allocMatrix(REALSXP, nx, ny));
00205 numProtected++;
00206 for (int i = 0; i < nx; i++)
00207 for (int j = 0; j < ny; j++)
00208 REAL(value)[i + nx*j] = mat[i][j];
00209 values.push_back(make_pair(name, value));
00210 }
00211
00212 void RcppResultSet::add(std::string name, RcppVector<int>& vec) {
00213 int len = vec.size();
00214 int *a = vec.cVector();
00215 SEXP value = PROTECT(Rf_allocVector(INTSXP, len));
00216 numProtected++;
00217 for (int i = 0; i < len; i++)
00218 INTEGER(value)[i] = a[i];
00219 values.push_back(make_pair(name, value));
00220 }
00221
00222 void RcppResultSet::add(std::string name, RcppVector<double>& vec) {
00223 int len = vec.size();
00224 double *a = vec.cVector();
00225 SEXP value = PROTECT(Rf_allocVector(REALSXP, len));
00226 numProtected++;
00227 for (int i = 0; i < len; i++)
00228 REAL(value)[i] = a[i];
00229 values.push_back(make_pair(name, value));
00230 }
00231
00232 void RcppResultSet::add(std::string name, RcppMatrix<int>& mat) {
00233 int nx = mat.getDim1();
00234 int ny = mat.getDim2();
00235 int **a = mat.cMatrix();
00236 SEXP value = PROTECT(Rf_allocMatrix(INTSXP, nx, ny));
00237 numProtected++;
00238 for (int i = 0; i < nx; i++)
00239 for (int j = 0; j < ny; j++)
00240 INTEGER(value)[i + nx*j] = a[i][j];
00241 values.push_back(make_pair(name, value));
00242 }
00243
00244 void RcppResultSet::add(std::string name, RcppMatrix<double>& mat) {
00245 int nx = mat.getDim1();
00246 int ny = mat.getDim2();
00247 double **a = mat.cMatrix();
00248 SEXP value = PROTECT(Rf_allocMatrix(REALSXP, nx, ny));
00249 numProtected++;
00250 for (int i = 0; i < nx; i++)
00251 for (int j = 0; j < ny; j++)
00252 REAL(value)[i + nx*j] = a[i][j];
00253 values.push_back(make_pair(name, value));
00254 }
00255
00256 void RcppResultSet::add(std::string name, RcppFrame& frame) {
00257 std::vector<std::string> colNames = frame.getColNames();
00258 std::vector<std::vector<ColDatum> > table = frame.getTableData();
00259 int ncol = colNames.size();
00260 int nrow = table.size();
00261 SEXP rl = PROTECT(Rf_allocVector(VECSXP,ncol));
00262 SEXP nm = PROTECT(Rf_allocVector(STRSXP,ncol));
00263 numProtected += 2;
00264 for (int i=0; i < ncol; i++) {
00265 SEXP value, names;
00266 if (table[0][i].getType() == COLTYPE_DOUBLE) {
00267 value = PROTECT(Rf_allocVector(REALSXP,nrow));
00268 numProtected++;
00269 for (int j=0; j < nrow; j++)
00270 REAL(value)[j] = table[j][i].getDoubleValue();
00271 } else if (table[0][i].getType() == COLTYPE_INT) {
00272 value = PROTECT(Rf_allocVector(INTSXP,nrow));
00273 numProtected++;
00274 for (int j=0; j < nrow; j++)
00275 INTEGER(value)[j] = table[j][i].getIntValue();
00276 } else if (table[0][i].getType() == COLTYPE_FACTOR) {
00277 value = PROTECT(Rf_allocVector(INTSXP,nrow));
00278 numProtected++;
00279 int levels = table[0][i].getFactorNumLevels();
00280 names = PROTECT(Rf_allocVector(STRSXP,levels));
00281 numProtected++;
00282 std::string *levelNames = table[0][i].getFactorLevelNames();
00283 for (int k=0; k < levels; k++)
00284 SET_STRING_ELT(names, k, Rf_mkChar(levelNames[k].c_str()));
00285 for (int j=0; j < nrow; j++) {
00286 int level = table[j][i].getFactorLevel();
00287 INTEGER(value)[j] = level;
00288 }
00289 Rf_setAttrib(value, R_LevelsSymbol, names);
00290 SEXP factorclass = PROTECT(Rf_allocVector(STRSXP,1));
00291 numProtected++;
00292 SET_STRING_ELT(factorclass, 0, Rf_mkChar("factor"));
00293 Rf_setAttrib(value, R_ClassSymbol, factorclass);
00294 } else if (table[0][i].getType() == COLTYPE_STRING) {
00295 value = PROTECT(Rf_allocVector(STRSXP,nrow));
00296 numProtected++;
00297 for (int j=0; j < nrow; j++) {
00298 SET_STRING_ELT(value, j, Rf_mkChar(table[j][i].getStringValue().c_str()));
00299 }
00300 } else if (table[0][i].getType() == COLTYPE_LOGICAL) {
00301 value = PROTECT(Rf_allocVector(LGLSXP,nrow));
00302 numProtected++;
00303 for (int j=0; j < nrow; j++) {
00304 LOGICAL(value)[j] = table[j][i].getLogicalValue();
00305 }
00306 } else if (table[0][i].getType() == COLTYPE_DATE) {
00307 value = PROTECT(Rf_allocVector(REALSXP,nrow));
00308 numProtected++;
00309 for (int j=0; j < nrow; j++)
00310 REAL(value)[j] = table[j][i].getDateRCode();
00311 SEXP dateclass = PROTECT(Rf_allocVector(STRSXP,1));
00312 numProtected++;
00313 SET_STRING_ELT(dateclass, 0, Rf_mkChar("Date"));
00314 Rf_setAttrib(value, R_ClassSymbol, dateclass);
00315 } else if (table[0][i].getType() == COLTYPE_DATETIME) {
00316 value = PROTECT(Rf_allocVector(REALSXP,nrow));
00317 numProtected++;
00318 for (int j=0; j < nrow; j++) {
00319
00320
00321 REAL(value)[j] = table[j][i].getDatetimeValue().getFractionalTimestamp();
00322 }
00323 SEXP dateclass = PROTECT(Rf_allocVector(STRSXP,2));
00324 numProtected++;
00325 SET_STRING_ELT(dateclass, 0, Rf_mkChar("POSIXt"));
00326 SET_STRING_ELT(dateclass, 1, Rf_mkChar("POSIXct"));
00327 Rf_setAttrib(value, R_ClassSymbol, dateclass);
00328 } else {
00329 throw std::range_error("RcppResultSet::add invalid column type");
00330 }
00331 SET_VECTOR_ELT(rl, i, value);
00332 SET_STRING_ELT(nm, i, Rf_mkChar(colNames[i].c_str()));
00333 }
00334 Rf_setAttrib(rl, R_NamesSymbol, nm);
00335 values.push_back(make_pair(name, rl));
00336 }
00337
00338 void RcppResultSet::add(std::string name, RcppList &list) {
00339
00340 values.push_back(make_pair(name, list.getList()));
00341 }
00342
00343 void RcppResultSet::add(std::string name, SEXP sexp, bool isProtected) {
00344 values.push_back(make_pair(name, sexp));
00345 if (isProtected)
00346 numProtected++;
00347 }
00348
00349 SEXP RcppResultSet::getReturnList() {
00350 int nret = (int)values.size();
00351 SEXP rl = PROTECT(Rf_allocVector(VECSXP,nret));
00352 SEXP nm = PROTECT(Rf_allocVector(STRSXP,nret));
00353 std::list<std::pair<std::string,SEXP> >::iterator iter = values.begin();
00354 for (int i = 0; iter != values.end(); iter++, i++) {
00355 SET_VECTOR_ELT(rl, i, iter->second);
00356 SET_STRING_ELT(nm, i, Rf_mkChar(iter->first.c_str()));
00357 }
00358 Rf_setAttrib(rl, R_NamesSymbol, nm);
00359 UNPROTECT(numProtected+2);
00360 return rl;
00361 }
00362
00363 SEXP RcppResultSet::getSEXP() {
00364 if (values.size() != 1) {
00365 throw std::range_error("RcppResultSet::getSEXP only sensible for single return arguments");
00366 }
00367 SEXP val = values.begin()->second;
00368 UNPROTECT(numProtected);
00369 return val;
00370 }
00371