Thanks a lot .  Appreciate your time . I am sorry for missing snippets of
the code , trying to copy back and forth . My bad .sorry for that .

The dataframe df is to be of VECSXP .
PROTECT(df = allocVector(VECSXP,2));

What I am trying to do ?

Lets say you read a huge table , with each column is different datatype
some integer , some real,some string , some raw . And you have to return  a
dataframe after reading it . So what I did lets create a array of SEXP (
SEXP dataframevalues[noOfCols] ) . Now from table each column is read and
also the datatype is obtained. I allocate each array with number of values
to be inserted .

Now there is one outer vector of type VECSXP , which will hold the
dataframe[noOfCols] . So VECSXP is of  length noOfCols.
. After that a R internal call is performed to convert it to a data frame
format .


And yes , i want to set for column Names, not row names.
Thanks,



On Thu, Jun 26, 2014 at 6:35 PM, Hervé Pagès <hpa...@fhcrc.org> wrote:

> On 06/26/2014 05:18 PM, Sandip Nandi wrote:
>
>> 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.
>>
>>
> Please understand that the code you send is useful for the discussion
> only if we can understand it. And for this it needs to make sense.
> The code below still makes little sense. Did you try it? For example
> you're calling SET_VECTOR_ELT() and setAttrib() on an SEXP ('df') that
> you didn't even allocate. Sounds maybe like a detail but because of
> that the code will segfault and, more importantly, it's not clear what
> kind of SEXP you want 'df' to be.
>
> Also the following line makes no sense:
>
>   setAttrib(df,R_RowNamesSymbol,lsnm);
>
> given that 'lsnm' is c("int", "string") so it looks more like the col
> names than the row names (and also because you're apparently trying to
> make a 3x2 data.frame, not a 2x2).
>
> Anyway, once you realize that a data.frame is just a list with 3
> attributes:
>
>   > attributes(data.frame(int=c(99,89,12), string=c("aa", "vv", "gy")))
>   $names
>   [1] "int"    "string"
>
>   $row.names
>   [1] 1 2 3
>
>   $class
>   [1] "data.frame"
>
> everything becomes simple at the C level i.e. just make that list
> and stick these 3 attributes on it. You don't need to call R code
> from C (which BTW will protect you from random changes in the behavior
> of the data.frame() constructor). You don't need the intermediate
> 'valueVector' data structure (what you seem to be referring to as the
> "2D array of SEXP", don't know why, doesn't look like a 2D array to me,
> but you never explained).
>
> Cheers,
> H.
>
>
>  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
>> <mailto: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>
>>         <mailto: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>
>>         <mailto: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>
>>
>>
>>                  <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>
>>         <mailto:hpa...@fhcrc.org <mailto:hpa...@fhcrc.org>>
>>
>>              Phone: (206) 667-5791 <tel:%28206%29%20667-5791>
>>         <tel:%28206%29%20667-5791>
>>              Fax: (206) 667-1319 <tel:%28206%29%20667-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 <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

Reply via email to