Exemple #1
0
 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;
 }
Exemple #2
0
/**
 * @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;
}
Exemple #3
0
/**
 * @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