SEXP appendListElements(SEXP r_list, const std::vector<SEXP> &new_elements, const std::vector<std::string> &new_element_names) { if (new_element_names.size() != new_elements.size()) { report_error("In appendListElements: The vector of new elements must " "be the same size as the vector of new element names."); } int original_list_length = Rf_length(r_list); SEXP ans; PROTECT(ans = Rf_allocVector( VECSXP, original_list_length + new_elements.size())); for (int i = 0; i < original_list_length; ++i) { SET_VECTOR_ELT(ans, i, VECTOR_ELT(r_list, i)); } for (int i = 0; i < new_elements.size(); ++i) { SET_VECTOR_ELT(ans, i + original_list_length, new_elements[i]); } std::vector<std::string> new_list_names = getListNames(r_list); for (int i = 0; i < new_element_names.size(); ++i) { new_list_names.push_back(new_element_names[i]); } ans = setListNames(ans, new_list_names); UNPROTECT(1); return ans; }
/** * @param arg_fileName: a string character * @param arg_geneFile: which gene file to use * @param arg_geneName: which gene we are interested. (just allow One gene * name). */ SEXP impl_readBGENToMatrixByGene(SEXP arg_fileName, SEXP arg_geneFile, SEXP arg_geneName) { SEXP ans = R_NilValue; std::string FLAG_fileName = CHAR(STRING_ELT(arg_fileName, 0)); std::string FLAG_geneFile = CHAR(STRING_ELT(arg_geneFile, 0)); std::vector<std::string> FLAG_geneName; extractStringArray(arg_geneName, &FLAG_geneName); if (FLAG_fileName.size() == 0) { error("Please provide BGEN file name"); } if (FLAG_geneName.size() && FLAG_geneFile.size() == 0) { error("Please provide gene file name when extract genotype by gene"); } int nGene = FLAG_geneName.size(); Rprintf("%d region to be extracted.\n", nGene); int numAllocated = 0; // allocate return value PROTECT(ans = allocVector(VECSXP, nGene)); numAllocated++; setListNames(FLAG_geneName, &ans); OrderedMap<std::string, std::string> geneRange; loadGeneFile(FLAG_geneFile, FLAG_geneName, &geneRange); for (int i = 0; i < nGene; ++i) { // REprintf("range = %s\n", FLAG_geneName[i].c_str()); const std::string& range = geneRange[FLAG_geneName[i]]; // Rprintf( "range = %s\n", range.c_str()); BGenFile bin(FLAG_fileName); if (range.size()) bin.setRangeList(range.c_str()); else { warning("Gene name [ %s ] does not exists in provided gene file", FLAG_geneName[i].c_str()); UNPROTECT(numAllocated); return (ans); }; // real working part SET_VECTOR_ELT(ans, i, readBGEN2Matrix(&bin)); } UNPROTECT(numAllocated); return ans; }
/** * @param arg_fileName: a string character * @param arg_geneFile: which gene file to use * @param arg_geneName: which gene we are interested. (just allow One gene * name). */ SEXP impl_readBGENToMatrixByRange(SEXP arg_fileName, SEXP arg_range) { SEXP ans = R_NilValue; std::string FLAG_fileName = CHAR(STRING_ELT(arg_fileName, 0)); std::vector<std::string> FLAG_range; extractStringArray(arg_range, &FLAG_range); if (FLAG_fileName.size() == 0) { error("Please provide BGEN file name"); return ans; } if (FLAG_range.empty()) { error("Please provide a given range, e.g. '1:100-200'"); return ans; } int nGene = FLAG_range.size(); Rprintf("%d region to be extracted.\n", nGene); int numAllocated = 0; // allocate return value PROTECT(ans = allocVector(VECSXP, nGene)); numAllocated++; setListNames(FLAG_range, &ans); for (int i = 0; i < nGene; ++i) { // REprintf("range = %s\n", FLAG_range[i].c_str()); BGenFile bin(FLAG_fileName); bin.setRangeList(FLAG_range[i].c_str()); // real working part SET_VECTOR_ELT(ans, i, readBGEN2Matrix(&bin)); } UNPROTECT(numAllocated); return ans; } // end impl_readBGENToMatrixByRange