[Rd] using 2D array of SEXP for creating dataframe

Hervé Pagès hpages at fhcrc.org
Fri Jun 27 01:52:11 CEST 2014


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 <hpages at fhcrc.org
> <mailto:hpages at 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 at r-project.org <mailto:R-devel at 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: hpages at fhcrc.org <mailto:hpages at 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: hpages at fhcrc.org
Phone:  (206) 667-5791
Fax:    (206) 667-1319



More information about the R-devel mailing list