Hi, Can you give us what str on the returned object gives you?
I think you need : SET_OBJECT(and, 1) ; at the end. Romain Le 24 juin 2014 à 08:57, Yu Gong <armg...@yahoo.com> a écrit : > there is my code, expect return value is a data frame but R say it is list: > > SEXP Julia_R_MD_NA_DataFrame(jl_value_t* Var) > { > SEXP ans,names,rownames; > char evalcmd[4096]; > int i; > const char* dfname="DataFrameName0tmp"; > jl_set_global(jl_main_module, jl_symbol(dfname), (jl_value_t*)Var); > //Get Frame cols > sprintf(evalcmd,"size(%s,2)",dfname); > jl_value_t* cols=jl_eval_string(evalcmd); > int collen=jl_unbox_long(cols); > jl_value_t* eachcolvector; > //Create VECSXP > > //Create SEXP for Each Column and assign > PROTECT(ans=allocVector(VECSXP,collen)); > for (i=0;i<collen;i++) > { > sprintf(evalcmd,"%s[%d]",dfname,i+1); > eachcolvector=jl_eval_string(evalcmd); > SET_VECTOR_ELT(ans,i,Julia_R_MD_NA(eachcolvector)); > } > //set names attribute > sprintf(evalcmd,"names(%s)",dfname); > jl_value_t* ret=jl_eval_string(evalcmd); > jl_value_t* onesymbol; > if (jl_is_array(ret)) > { > PROTECT(names=allocVector(STRSXP,collen)); > for (i=0;i<jl_array_len(ret);i++) > { > onesymbol=jl_arrayref((jl_array_t*)ret,i); > if (jl_is_symbol(onesymbol)) > SET_STRING_ELT(names,i,mkChar(((jl_sym_t*)onesymbol)->name)); > } > setAttrib(ans,R_NamesSymbol,names); > UNPROTECT(1); > } > //set row names > sprintf(evalcmd,"size(%s,1)",dfname); > jl_value_t* rows=jl_eval_string(evalcmd); > int rowlen=jl_unbox_long(rows); > PROTECT(rownames=allocVector(INTSXP,rowlen)); > for (i=0;i<rowlen;i++) > INTEGER(rownames)[i]=i+1; > setAttrib(ans,R_RowNamesSymbol,rownames); > UNPROTECT(1); > //set class as data frame > setAttrib(ans,R_ClassSymbol,mkString("data.frame")); > UNPROTECT(1); > return ans; > } ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel