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();
}