SEXP toSEXP()

in src/RStudioApi.cpp [20:77]


SEXP toSEXP(const RObject &rObject) {
  switch (rObject.object_case()) {
    case RObject::kRString: {
      ShieldSEXP x = Rf_allocVector(STRSXP, rObject.rstring().strings_size());
      for (int i = 0; i < (int) rObject.rstring().strings_size(); ++i) {
        SET_STRING_ELT(x, i, mkCharUTF8(rObject.rstring().strings(i)));
      }
      return x;
    }
    case RObject::kRInt: {
      ShieldSEXP x = Rf_allocVector(INTSXP, rObject.rint().ints_size());
      for (int i = 0; i < (int) rObject.rint().ints_size(); ++i) {
        INTEGER(x)[i] = rObject.rint().ints(i);
      }
      return x;
    }
    case RObject::kRDouble: {
      ShieldSEXP x = Rf_allocVector(REALSXP, rObject.rdouble().doubles_size());
      for (int i = 0; i < (int) rObject.rdouble().doubles_size(); ++i) {
        REAL(x)[i] = rObject.rdouble().doubles(i);
      }
      return x;
    }
    case RObject::OBJECT_NOT_SET:
      return allocVector(VECSXP, 0);
    case RObject::kRNull:
      return R_NilValue;
    case RObject::kRBoolean: {
      ShieldSEXP x = Rf_allocVector(LGLSXP, rObject.rboolean().booleans_size());
      for (int i = 0; i < (int) rObject.rboolean().booleans_size(); ++i) {
        LOGICAL(x)[i] = rObject.rboolean().booleans(i);
      }
      return x;
    }
    case RObject::kList: {
      ShieldSEXP res = allocVector(VECSXP, rObject.list().robjects_size());
      for (size_t i = 0; i < rObject.list().robjects_size(); i++) {
        SET_VECTOR_ELT(res, i, toSEXP(rObject.list().robjects(i)));
      }
      return res;
    }
    case RObject::kNamedList: {
      ShieldSEXP names = Rf_allocVector(STRSXP, rObject.namedlist().robjects_size());
      for (int i = 0; i < (int) rObject.namedlist().robjects_size(); ++i) {
        SET_STRING_ELT(names, i, mkCharUTF8(rObject.namedlist().robjects(i).key()));
      }
      ShieldSEXP values = allocVector(VECSXP, rObject.namedlist().robjects_size());
      for (size_t i = 0; i < rObject.namedlist().robjects_size(); i++) {
        SET_VECTOR_ELT(values, i, toSEXP(rObject.namedlist().robjects(i).value()));
      }
      Rf_setAttrib(values, R_NamesSymbol, names);
      return values;
    }
    case RObject::kError: {
      error_return(rObject.error().data())
    }
  }
}