SEXP jr_cast(jl_value_t *tt){ SEXP ans = R_NilValue; JL_GC_PUSH1(&tt); if (jl_is_nothing(tt) || jl_is_null(tt)) return ans; if (jl_is_array(tt)) { ans = jr_array(tt); } else if(jl_isa(tt, "Range")) { ans = jr_range(tt); } else if(jl_isa(tt, "DataArray")) { ans = jr_data_array(tt); } else if(jl_isa(tt, "DataFrame")) { ans = jr_data_frame(tt); } else if (jl_is_tuple(tt)) { PROTECT(ans = Rf_allocVector(VECSXP, jl_tuple_len(tt))); for (int i = 0; i < jl_tuple_len(tt); i++) SET_VECTOR_ELT(ans, i, jr_cast(jl_tupleref(tt, i))); UNPROTECT(1); } else if(jl_isa(tt, "Dict")) { ans = jr_dict(tt); } else if(jl_is_function(tt)) { ans = jr_func(tt); } else { ans = jr_scalar(tt); } JL_GC_POP(); if (ans == R_NilValue) { jl_error("invaild object"); } return ans; }
//Convert Julia Type To R,Real interface SEXP Julia_R(jl_value_t *Var) { SEXP ans = R_NilValue; if (jl_is_nothing(Var) || jl_is_null(Var)) return ans; //Array To Vector JL_GC_PUSH1(&Var); if (jl_is_array(Var)) { ans = Julia_R_MD(Var); } else if (jl_is_DataArrayFrame(Var)) { //try to load DataArrays DataFrames package if (!LoadDF()) { JL_GC_POP(); return R_NilValue; } if (jl_is_NAtype(Var)) ans = Julia_R_Scalar_NA(Var); else if (jl_is_DataFrame(Var)) ans = Julia_R_MD_NA_DataFrame(Var); else if (jl_is_DataArray(Var)) ans = Julia_R_MD_NA(Var); else if (jl_is_PooledDataArray(Var)) ans = Julia_R_MD_NA_Factor(Var); } else if (jl_is_tuple(Var)) { PROTECT(ans = allocVector(VECSXP, jl_tuple_len(Var))); for (int i = 0; i < jl_tuple_len(Var); i++) SET_ELEMENT(ans, i, Julia_R(jl_tupleref(Var, i))); UNPROTECT(1); } else ans = Julia_R_Scalar(Var); JL_GC_POP(); return ans; }
DLLEXPORT jl_value_t *jl_exception_occurred(void) { return jl_is_null(jl_exception_in_transit) ? NULL : jl_exception_in_transit; }