List DbDataFrame::get_data(std::vector<DATA_TYPE>& types_) { // Trim back to what we actually used finalize_cols(); types_.clear(); std::transform(data.begin(), data.end(), std::back_inserter(types_), std::mem_fun_ref(&DbColumn::get_type)); boost::for_each(data, names, boost::bind(&DbColumn::warn_type_conflicts, _1, _2)); List out(data.begin(), data.end()); StringVector names_utf8 = wrap(names); for (int j = 0; j < names_utf8.size(); ++j) { names_utf8[j] = Rf_mkCharCE(names_utf8[j], CE_UTF8); } out.attr("names") = names_utf8; out.attr("class") = "data.frame"; out.attr("row.names") = IntegerVector::create(NA_INTEGER, -i); return out; }
// adapted from https://github.com/armgong/RJulia/blob/master/src/R_Julia.c SEXP jr_scalar(jl_value_t *tt) { SEXP ans = R_NilValue; double z; // float64, int64, int32 are most common, so put them in the front if (jl_is_float64(tt)) { PROTECT(ans = Rf_ScalarReal(jl_unbox_float64(tt))); UNPROTECT(1); } else if (jl_is_int32(tt)) { PROTECT(ans = Rf_ScalarInteger(jl_unbox_int32(tt))); UNPROTECT(1); } else if (jl_is_int64(tt)) { z = (double)jl_unbox_int64(tt); if (in_int32_range(z)) PROTECT(ans = Rf_ScalarInteger((int32_t)jl_unbox_int64(tt))); else PROTECT(ans = Rf_ScalarReal(z)); UNPROTECT(1); } else if (jl_is_bool(tt)) { PROTECT(ans = Rf_ScalarLogical(jl_unbox_bool(tt))); UNPROTECT(1); } else if (jl_is_int8(tt)) { PROTECT(ans = Rf_ScalarInteger(jl_unbox_int8(tt))); UNPROTECT(1); } else if (jl_is_uint8(tt)) { PROTECT(ans = Rf_ScalarInteger(jl_unbox_uint8(tt))); UNPROTECT(1); } else if (jl_is_int16(tt)) { PROTECT(ans = Rf_ScalarInteger(jl_unbox_int16(tt))); UNPROTECT(1); } else if (jl_is_uint16(tt)) { PROTECT(ans = Rf_ScalarInteger(jl_unbox_uint16(tt))); UNPROTECT(1); } else if (jl_is_uint32(tt)) { z = (double)jl_unbox_uint32(tt); if (in_int32_range(z)) PROTECT(ans = Rf_ScalarInteger((int32_t)jl_unbox_uint32(tt))); else PROTECT(ans = Rf_ScalarReal(z)); UNPROTECT(1); } else if (jl_is_uint64(tt)) { z = (double)jl_unbox_int64(tt); if (in_int32_range(z)) PROTECT(ans = Rf_ScalarInteger((int32_t)jl_unbox_uint64(tt))); else PROTECT(ans = Rf_ScalarReal(z)); UNPROTECT(1); } else if (jl_is_float32(tt)) { PROTECT(ans = Rf_ScalarReal(jl_unbox_float32(tt))); UNPROTECT(1); } else if (jl_is_utf8_string(tt)) { PROTECT(ans = Rf_allocVector(STRSXP, 1)); SET_STRING_ELT(ans, 0, Rf_mkCharCE(jl_string_data(tt), CE_UTF8)); UNPROTECT(1); } else if (jl_is_ascii_string(tt)) { PROTECT(ans = Rf_ScalarString(Rf_mkChar(jl_string_data(tt)))); UNPROTECT(1); } return ans; }
// adapted from https://github.com/armgong/RJulia/blob/master/src/R_Julia.c SEXP jr_array(jl_value_t *tt) { SEXP ans = R_NilValue; //get Julia dims and set R array Dims int len = jl_array_len(tt); if (len == 0) return ans; jl_datatype_t *ty = jl_array_eltype(tt); int ndims = jl_array_ndims(tt); SEXP dims; PROTECT(dims = Rf_allocVector(INTSXP, ndims)); for (size_t i = 0; i < ndims; i++) INTEGER(dims)[i] = jl_array_dim(tt, i); UNPROTECT(1); // again, float64, int32 and int64 are most common if (ty == jl_float64_type) { double *p = (double *) jl_array_data(tt); PROTECT(ans = Rf_allocArray(REALSXP, dims)); for (size_t i = 0; i < len; i++) REAL(ans)[i] = p[i]; UNPROTECT(1);; } else if (ty == jl_int32_type) { int32_t *p = (int32_t *) jl_array_data(tt); PROTECT(ans = Rf_allocArray(INTSXP, dims)); for (size_t i = 0; i < len; i++) INTEGER(ans)[i] = p[i]; UNPROTECT(1); } else if (ty == jl_int64_type) { int is_int32 = 1; int64_t *p = (int64_t *) jl_array_data(tt); for (size_t i=0;i<len;i++) { if (p[i]>INT32_MAX || p[i]<INT32_MIN) { is_int32 = 0; break; } } if (is_int32) { PROTECT(ans = Rf_allocArray(INTSXP, dims)); for (size_t i = 0; i < len; i++) INTEGER(ans)[i] = p[i]; UNPROTECT(1); } else { PROTECT(ans = Rf_allocArray(REALSXP, dims)); for (size_t i = 0; i < len; i++) REAL(ans)[i] = p[i]; UNPROTECT(1); } } else if (ty == jl_bool_type) { bool *p = (bool *) jl_array_data(tt); PROTECT(ans = Rf_allocArray(LGLSXP, dims)); for (size_t i = 0; i < len; i++) LOGICAL(ans)[i] = p[i]; UNPROTECT(1); } else if (ty == jl_int8_type) { int8_t *p = (int8_t *) jl_array_data(tt); PROTECT(ans = Rf_allocArray(INTSXP, dims)); for (size_t i = 0; i < len; i++) INTEGER(ans)[i] = p[i]; UNPROTECT(1); } else if (ty == jl_uint8_type) { uint8_t *p = (uint8_t *) jl_array_data(tt); PROTECT(ans = Rf_allocArray(INTSXP, dims)); for (size_t i = 0; i < len; i++) INTEGER(ans)[i] = p[i]; UNPROTECT(1); } else if (ty == jl_int16_type) { int16_t *p = (int16_t *) jl_array_data(tt); PROTECT(ans = Rf_allocArray(INTSXP, dims)); for (size_t i = 0; i < len; i++) INTEGER(ans)[i] = p[i]; UNPROTECT(1); } else if (ty == jl_uint16_type) { uint16_t *p = (uint16_t *) jl_array_data(tt); PROTECT(ans = Rf_allocArray(INTSXP, dims)); for (size_t i = 0; i < len; i++) INTEGER(ans)[i] = p[i]; UNPROTECT(1); } else if (ty == jl_uint32_type) { int is_int32 = 1; uint32_t *p = (uint32_t *) jl_array_data(tt); for (size_t i=0;i<len;i++) { if (p[i]>INT32_MAX || p[i]<INT32_MIN) { is_int32 = 0; break; } } if (is_int32) { PROTECT(ans = Rf_allocArray(INTSXP, dims)); for (size_t i = 0; i < len; i++) INTEGER(ans)[i] = p[i]; UNPROTECT(1); } else { PROTECT(ans = Rf_allocArray(REALSXP, dims)); for (size_t i = 0; i < len; i++) REAL(ans)[i] = p[i]; UNPROTECT(1); } } else if (ty == jl_uint64_type) { int is_int32 = 1; uint64_t *p = (uint64_t *) jl_array_data(tt); for (size_t i=0;i<len;i++) { if (p[i]>INT32_MAX || p[i]<INT32_MIN) { is_int32 = 0; break; } } if (is_int32) { PROTECT(ans = Rf_allocArray(INTSXP, dims)); for (size_t i = 0; i < len; i++) INTEGER(ans)[i] = p[i]; UNPROTECT(1); } else { PROTECT(ans = Rf_allocArray(REALSXP, dims)); for (size_t i = 0; i < len; i++) REAL(ans)[i] = p[i]; UNPROTECT(1); } } //double else if (ty == jl_float32_type) { float *p = (float *) jl_array_data(tt); PROTECT(ans = Rf_allocArray(REALSXP, dims)); for (size_t i = 0; i < len; i++) REAL(ans)[i] = p[i]; UNPROTECT(1);; } //utf8 string else if (ty == jl_utf8_string_type) { PROTECT(ans = Rf_allocArray(STRSXP, dims)); for (size_t i = 0; i < len; i++) SET_STRING_ELT(ans, i, Rf_mkCharCE(jl_string_data(jl_cellref(tt, i)), CE_UTF8)); UNPROTECT(1); } else if (ty == jl_ascii_string_type) { PROTECT(ans = Rf_allocArray(STRSXP, dims)); for (size_t i = 0; i < len; i++) SET_STRING_ELT(ans, i, Rf_mkChar(jl_string_data(jl_cellref(tt, i)))); UNPROTECT(1); } return ans; }