RObject fromSEXP()

in src/RStudioApi.cpp [79:120]


RObject fromSEXP(SEXP const &expr) {
  if (TYPEOF(expr) == VECSXP) {
    RObject result;
    result.set_allocated_list(new RObject_List);
    for (size_t i = 0; i < LENGTH(expr); i++) {
      result.mutable_list()->mutable_robjects()->Add(fromSEXP(VECTOR_ELT(expr, i)));
    }
    return result;
  } else if (TYPEOF(expr) == REALSXP) {
    RObject result;
    result.set_allocated_rdouble(new RObject_RDouble);
    for (size_t i = 0; i < LENGTH(expr); i++) {
      result.mutable_rdouble()->add_doubles(REAL(expr)[i]);
    }
    return result;
  } else if (TYPEOF(expr) == INTSXP) {
    RObject result;
    result.set_allocated_rint(new RObject_RInt);
    for (size_t i = 0; i < LENGTH(expr); i++) {
      result.mutable_rint()->add_ints(INTEGER(expr)[i]);
    }
    return result;
  } else if (TYPEOF(expr) == STRSXP) {
    RObject result;
    result.set_allocated_rstring(new RObject_RString);
    for (size_t i = 0; i < LENGTH(expr); i++) {
      result.mutable_rstring()->add_strings(asStringUTF8OrError(STRING_ELT(expr, i)));
    }
    return result;
  } else if (TYPEOF(expr) == NILSXP) {
    RObject result;
    result.set_allocated_rnull(new RObject_RNull);
    return result;
  } else if (TYPEOF(expr) == LGLSXP) {
    RObject result;
    result.set_allocated_rboolean(new RObject_RBoolean);
    for (size_t i = 0; i < LENGTH(expr); i++) {
      result.mutable_rboolean()->add_booleans(LOGICAL(expr)[i]);
    }
    return result;
  } else throw std::exception();
}