//virtual void save(string new_file_name, unsigned long int nvars, unsigned long int nobss, unsigned long int * varindexes, unsigned long int * obsindexes) SEXP save_R(SEXP New_file_name, SEXP IntPars, SEXP s) { CHECK_PTR(s); AbstractMatrix * p = (AbstractMatrix*) R_ExternalPtrAddr(s); if (p == NULL) { error_R("pointer is NULL\n"); return R_NilValue; } std::string new_file_name = CHAR(STRING_ELT(New_file_name, 0)); unsigned long int nvars = (unsigned long int) INTEGER(IntPars)[0]; unsigned long int nobss = (unsigned long int) INTEGER(IntPars)[1]; unsigned long int varindexes[nvars]; unsigned long int obsindexes[nobss]; for (unsigned long int i = 0; i < nvars; i++) varindexes[i] = (unsigned long int) INTEGER(IntPars)[i + 2]; for (unsigned long int i = 0; i < nobss; i++) obsindexes[i] = (unsigned long int) INTEGER(IntPars)[i + 2 + nvars]; try { p->saveAs(new_file_name, nvars, nobss, varindexes, obsindexes); } catch (int errcode) { error_R("can not save data to file %s\n", new_file_name.c_str()); return R_NilValue; } SEXP ret; PROTECT(ret = allocVector(LGLSXP, 1)); LOGICAL(ret)[0] = TRUE; UNPROTECT(1); return ret; }
//virtual void save(string newFilename, unsigned long nvars, unsigned long nobss, unsigned long * varindexes, unsigned long * obsindexes) SEXP save_R(SEXP New_file_name, SEXP IntPars, SEXP s) { // dbg<<"save_R"<<endl; AbstractMatrix * p = getAbstractMatrixFromSEXP(s); if (p == NULL) { error_R("pointer is NULL\n"); return R_NilValue; } string newFilename = CHAR(STRING_ELT(New_file_name,0)); unsigned long nvars = (unsigned long) INTEGER(IntPars)[0]; unsigned long nobss = (unsigned long) INTEGER(IntPars)[1]; unsigned long * varindexes = new (std::nothrow) unsigned long [nvars]; if (varindexes == NULL) { error_R("pointer is NULL\n"); return R_NilValue; } unsigned long * obsindexes = new (std::nothrow) unsigned long [nobss]; if (obsindexes == NULL) { error_R("pointer is NULL\n"); delete [] varindexes; return R_NilValue; } for (unsigned long i = 0; i < nvars; i++) varindexes[i] = (unsigned long) INTEGER(IntPars)[i+2]; for (unsigned long i = 0; i < nobss; i++) { obsindexes[i] = (unsigned long) INTEGER(IntPars)[i+2+nvars]; } try { p->saveAs(newFilename,nvars,nobss,varindexes,obsindexes); } catch (int errcode) { error_R("can not save data to file %s\n",newFilename.c_str()); delete [] obsindexes; delete [] varindexes; return R_NilValue; } SEXP ret; PROTECT(ret = allocVector(LGLSXP, 1)); LOGICAL(ret)[0] = TRUE; delete [] obsindexes; delete [] varindexes; UNPROTECT(1); return ret; }
SEXP saveAsText(SEXP s, SEXP New_file_name, SEXP IntPars, SEXP NANString ) { AbstractMatrix * p = getAbstractMatrixFromSEXP(s); if (p == NULL) { error_R("pointer is NULL\n"); return R_NilValue; } string newFilename = CHAR(STRING_ELT(New_file_name,0)); string nanString = CHAR(STRING_ELT(NANString,0)); bool showVarNames = LOGICAL(IntPars)[0]; bool showObsNames = LOGICAL(IntPars)[1]; bool transpose = LOGICAL(IntPars)[2]; AbstractMatrix *transposed = p; string tmpFileName,tmpFileName2; if (!transpose){ Transposer transposer; tmpFileName= p->getFileName() + string("_saveAsText_tmp"); tmpFileName2= p->getFileName() + string("_saveAsText_tmp2"); p->saveAs(tmpFileName); transposer.process(tmpFileName, tmpFileName2, true); transposed = new FileVector(tmpFileName2, p->getCacheSizeInMb()); } try { transposed->saveAsText(newFilename, showVarNames, showObsNames, nanString); } catch (int errcode) { error_R("can not save data to file %s\n",newFilename.c_str()); return R_NilValue; } if (!transpose){ delete transposed; unlink(tmpFileName.c_str()); unlink(tmpFileName2.c_str()); } SEXP ret; PROTECT(ret = allocVector(LGLSXP, 1)); LOGICAL(ret)[0] = TRUE; UNPROTECT(1); return ret; }