Как правило, вы создаете список (общий вектор) с компонентами, которые вы хотите вернуть. В вашем случае что-то вроде
SEXP res = PROTECT(allocVector(VECSXP, 5));
SET_VECTOR_ELT(res, 0, ScalarInteger(a.thing1));
SET_VECTOR_ELT(res, 1, ScalarInteger(a.thing2));
SET_VECTOR_ELT(res, 2, ScalarReal(a.thing3));
...
UNPROTECT(1)
return res;
Также принято присваивать имена вектору, например ::
const char *names[5] = { "thing1", "thing2", "thing3", "thing4", "thing5" };
SEXP sNames = PROTECT(allocVector(STRSXP, 5));
for (int i = 0; i < 5; i++) SET_STRING_ELT(res, i, mkString(names[i]));
setAttrib(res, R_NamesSymbol, sNames);
UNPROTECT(1);
Обратите внимание, что вы описываете не массив, а структуру. Массивы, как правило, гораздо проще передавать как векторы.