From mtmorgan at fhcrc.org  Wed Sep 16 14:30:22 2009
From: mtmorgan at fhcrc.org (mtmorgan at fhcrc.org)
Date: Wed, 16 Sep 2009 05:30:22 -0700
Subject: [Rd] I want to get a reference to this time series object
In-Reply-To: <fc212e850909160002l7fc94109l83333f0d00b350ff@mail.gmail.com>
References: <fc212e850909160002l7fc94109l83333f0d00b350ff@mail.gmail.com>
Message-ID: <20090916053022.thhnlbo0ys4soo4c@webmail.fhcrc.org>

Quoting Abhijit Bera <abhibera at gmail.com>:

> I'm trying to get a reference to this object in C
>
> SWX.RET[1:6,c("SBI,"SPI","SII")]
>
> While i am able to access and use a plain SWX.RET object, I'm getting
> confused on how to create an object with the array subscripts like above.
>
> Here is what I tried to do. It doesn't work because "[" is obviously not an
> operation or function on SWX.RET. So how do I get a reference to this
> object?
>
> #include <stdio.h>
> #include <R.h>
> #include <Rinternals.h>
> #include <Rdefines.h>
> #include <Rembedded.h>
>
> int main(int argc, char** argv)
> {
>
>     SEXP e,c,portSpec,portData,portConstr,portVal,tsAssets;
>     int errorOccurred,nx,ny,i,j;
>     double *v;
>     const char *x,*y;
>
>     Rf_initEmbeddedR(argc, argv);
>
>     // loading fPortfolio
>     PROTECT(e = lang2(install("library"), mkString("fPortfolio")));
>     R_tryEval(e, R_GlobalEnv, NULL);
>     UNPROTECT(1);
>
>
>     // creating a default portfolioSpec object
>     PROTECT(e=lang1(install("portfolioSpec")));
>     PROTECT(portSpec=R_tryEval(e,R_GlobalEnv, NULL));
>
>     // creating a portfolioData object
>
>
> PROTECT(e=lang4(install("c"),mkString("SBI"),mkString("SPI"),mkString("SII")));


Here you might just as well construct this at the C level

       SEXP idx_j = PROTECT(NEW_CHARACTER(3));
       SET_STRING_ELT(idx_j, 0, mkChar("SBI"));
       ...

(is a PROTECT necessary on mkChar? I don't think SET_STRING_ELT will  
allocate memory).

>     PROTECT(c=R_tryEval(e,R_GlobalEnv,NULL));
>
>     PROTECT(e=lang3(install("["),install("SWX.RET"),c));

Here the call you are trying for is "["(SWX.RET, i, j) so

       SEXP idx_i = PROTECT(NEW_INTEGER(6));
       for (i = 0; i < LENGTH(idx_i); ++i)
            INTEGER(idx_i)[i] = i + 1;

       PROTECT(e = lang4(install("["), install("SWX.RET"),
                         idx_i, idx_j));

or

       PROTECT(e = lang4(install("["), install("SWX.RET"),
                         R_MissingArg, idx_j));


While it would be straight-forward to use R_ParseVector to execute a  
string representing this command, presumably your real code will want  
to represent the subscripts (and object) as C variables and not  
hard-coded or user-supplied strings.

Martin

>     PROTECT(portData=R_tryEval(e,R_GlobalEnv,NULL));
>
>     PROTECT(e=lang2(install("print"),portData));
>     R_tryEval(e,R_GlobalEnv,NULL);
>
>
>     UNPROTECT(3);
>
>     Rf_endEmbeddedR(0);
>
>     return 0;
> }
>
> 	[[alternative HTML version deleted]]
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>



[Rd] I want to get a reference to this time series object
mtmorgan at fhcrc.org