Hi , I have asked a question , whether the data structure I am using to create a dataframe is fine or there is anyother way i can use. My aim is to read a database and write it to dataframe and do operation on it . The dataframe creation ,output everything works . The code I put is wrong , trying to adding pieces and do it ,sorry for that. I feel my way of doing , creating a 2D array may not be the best, so if someone can point out any drawback of my method will be great . My code in production can read 100k rows and write in 15 seconds . But one case , when I try to assign NA_REAL to a real vector it causes floating point exception. So I doubt something is not wrong . People may be doing faster,efficient way.
This is a sample code */** *dfm is a dataframe which i assume as list of list . So I created a SEXP array valueVector[2] where each one can hold different datatype . Now values are assigned and dataframe is generated at end* **/* SEXP formDF() { SEXP dfm ,head,df , dfint , dfStr,lsnm; SEXP valueVector[2]; char *ab[3] = {"aa","vv","gy"}; int sn[3] ={99,89,12}; char *listnames[2] = {"int","string"}; int i,j; PROTECT(valueVector[0] = allocVector(REALSXP,3)); PROTECT(valueVector[1] = allocVector(STRSXP,3)); PROTECT(lsnm = allocVector(STRSXP,2)); SET_STRING_ELT(lsnm,0,mkChar("int")); SET_STRING_ELT(lsnm,1,mkChar("string")); for ( i = 0 ; i < 3; i++ ) { SET_STRING_ELT(valueVector[1],i,mkChar(ab[i])); REAL(valueVector[0])[i] = sn[i]; } SET_VECTOR_ELT(df,1,valueVector[0]); SET_VECTOR_ELT(df,0,valueVector[1]); setAttrib(df,R_RowNamesSymbol,lsnm); PROTECT(dfm=lang3(install("data.frame"),df,ScalarLogical(FALSE))); SET_TAG(CDDR(dfm), install("stringsAsFactors")) ; SEXP res = PROTECT(eval(dfm,R_GlobalEnv)); UNPROTECT(7); return res; } On Thu, Jun 26, 2014 at 4:52 PM, Hervé Pagès <hpa...@fhcrc.org> wrote: > Hi Sandip, > > > On 06/26/2014 04:21 PM, Sandip Nandi wrote: > >> Hi , >> >> I have put incomplete code here . The complete code works , My doubt is >> , what I am doing logical/safe ? Any memory leak going to happen ? is >> there any way to create dataframe ? >> > > I still don't believe it "works". It doesn't even compile. More below... > > > >> >> >> SEXP formDF() { >> >> SEXP dfm ,head,df , dfint , dfStr,lsnm; >> SEXP valueVector[2]; >> char *ab[3] = {"aa","vv","gy"}; >> int sn[3] ={99,89,12}; >> char *listnames[2] = {"int","string"}; >> int i,j; >> >> PROTECT(df = allocVector(VECSXP,2)); >> >> PROTECT(valueVector[0] = allocVector(REALSXP,3)); >> PROTECT(valueVector[1] = allocVector(VECSXP,3)); >> PROTECT(lsnm = allocVector(STRSXP,2)); >> >> SET_STRING_ELT(lsnm,0,mkChar("int")); >> SET_STRING_ELT(lsnm,1,mkChar("string")); >> SEXP rawvec,headr; >> >> for ( i = 0 ; i < 3; i++ ) { >> SET_STRING_ELT(valueVector[1],0,mkChar(listNames[i])); >> > > 'listNames' is undeclared (C is case-sensitive). > > Let's assume you managed to compile this with an (imaginary) > case-insensitive C compiler, 'listnames' is an array of length > 2 and this for loop tries to read the 3 first elements > from it. So you're just lucky that you didn't get a segfault. > In any case, I don't see how this code could produce > the data.frame you're trying to make. > > If you want to discuss how to improve code that *works* (i.e. > compiles and produces the expected result), that's fine, but you > should be able to show that code. Otherwise it sounds like you're > asking people to fix your code. Or to write it for you. Maybe > that's fine too but people will be more sympathetic and willing > to help if you're honest about it. > > Cheers, > H. > > REAL(valueVector[0])[i] = sn[i]; >> } >> >> SET_VECTOR_ELT(df,1,valueVector[0]); >> SET_VECTOR_ELT(df,0,valueVector[1]); >> setAttrib(df,R_RowNamesSymbol,lsnm); >> >> PROTECT(dfm=lang3(install("data.frame"),df,ScalarLogical(FALSE))); >> SET_TAG(CDDR(dfm), install("stringsAsFactors")) ; >> SEXP res = PROTECT(eval(dfm,R_GlobalEnv)); >> >> UNPROTECT(7); >> return res; >> >> } >> >> >> >> On Thu, Jun 26, 2014 at 3:49 PM, Hervé Pagès <hpa...@fhcrc.org >> <mailto:hpa...@fhcrc.org>> wrote: >> >> Hi, >> >> >> On 06/26/2014 02:32 PM, Sandip Nandi wrote: >> >> Hi , >> >> For our production package i need to create a dataframein C . So >> I wrote >> the following code >> >> SEXP dfm ,head,df , dfint , dfStr,lsnm; >> >> *SEXP valueVector[2];* >> >> >> char *ab[3] = {"aa","vv","gy"}; >> int sn[3] ={99,89,12}; >> char *listnames[2] = {"int","string"}; >> int i,j; >> >> //============================__= >> >> >> PROTECT(df = allocVector(VECSXP,2)); >> >> *PROTECT(valueVector[0] = allocVector(REALSXP,3));* >> *PROTECT(valueVector[1] = allocVector(VECSXP,3));* >> >> >> >> PROTECT(lsnm = allocVector(STRSXP,2)); >> >> SET_STRING_ELT(lsnm,0,mkChar("__int")); >> SET_STRING_ELT(lsnm,1,mkChar("__string")); >> >> SEXP rawvec,headr; >> unsigned char str[24]="abcdef"; >> >> for ( i = 0 ; i < 3; i++ ) { >> >> *SET_STRING_ELT(valueVector[1]__,i,mkChar(ab[i]));* >> >> *REAL(valueVector[0])[i] = sn[i];* >> >> } >> >> >> It works , data frame is being created and executed properly . >> >> >> Really? You mean, you can compile this code right? Otherwise it's >> incomplete: you allocate but do nothing with 'df'. Same with 'lsnm'. >> And you don't UNPROTECT. With no further treatment, 'df' will be an >> unnamed list containing junk data, but not the data.frame you expect. >> So there are a few gaps that would need to be filled before this code >> actually works as intended. >> >> Maybe try and come back again with specific questions? >> >> Cheers, >> H. >> >> > Just curious , if I am doing anything wrong or is there another >> way around >> >> for creation of data-frame . I am concerned about the SEXP 2D >> array . >> >> Thanks, >> Sandip >> >> [[alternative HTML version deleted]] >> >> ________________________________________________ >> R-devel@r-project.org <mailto:R-devel@r-project.org> mailing list >> https://stat.ethz.ch/mailman/__listinfo/r-devel >> >> <https://stat.ethz.ch/mailman/listinfo/r-devel> >> >> >> -- >> Hervé Pagès >> >> Program in Computational Biology >> Division of Public Health Sciences >> Fred Hutchinson Cancer Research Center >> 1100 Fairview Ave. N, M1-B514 >> P.O. Box 19024 >> Seattle, WA 98109-1024 >> >> E-mail: hpa...@fhcrc.org <mailto:hpa...@fhcrc.org> >> Phone: (206) 667-5791 <tel:%28206%29%20667-5791> >> Fax: (206) 667-1319 <tel:%28206%29%20667-1319> >> >> >> > -- > Hervé Pagès > > Program in Computational Biology > Division of Public Health Sciences > Fred Hutchinson Cancer Research Center > 1100 Fairview Ave. N, M1-B514 > P.O. Box 19024 > Seattle, WA 98109-1024 > > E-mail: hpa...@fhcrc.org > Phone: (206) 667-5791 > Fax: (206) 667-1319 > [[alternative HTML version deleted]]
______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel