[Rd] I want to get a reference to this time series object
mtmorgan at fhcrc.org
mtmorgan at fhcrc.org
Wed Sep 16 14:30:22 CEST 2009
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
>
More information about the R-devel
mailing list